使用RESTSharp C#反序列化JSON

5

我正在尝试在Xamarin应用程序中反序列化JSON。我已经阅读了很多相关内容,但仍然存在问题,也许在这里有人可以帮助:

我的JSON响应类似于以下内容:

{
    "Events":[
            {
                "id":7,
                "name":"show",
                "datefrom":"2012-01-01",
                "timeto":"12:00:00",
                "price":"3",
                "imagen":"null",
                "desc":"rock band playing",
                "info":"Info about tickets",
                "user":1,
                "place":9,
                "dateto":"2013-02-02",
                "timeto":"12:30:00",
                "Eventcategories":[]
            },
            {"id":2, name:...

根据我的阅读,我创建了两个类,一个用于对象(Event),另一个用于JSON响应(EventResponse)。 第二个类只有一个事件列表:

public class EventResponse
{
    public ObservableCollection<Event> Events { get; set; }
    public EventResponse(){
    }
    }
}

事件类包含JSON返回的所有字段:

private int _id;
        public int id {   
            get { return _id; }
            set {

                _id = value;
                OnPropertyChanged ();
            }
        }

        private string _nombre;
        public string nombre {   
            get { return _nombre; }
            set {
                if (value.Equals (_nombre, StringComparison.Ordinal))
                    return;
                _nombre = value;
                OnPropertyChanged ();
            }
        }...

在这之后,我希望我的应用程序能够解析这个JSON数据,但我只能获得包含JSON内容的字符串。

var client = new RestClient("myip/api/events");
            var request = new RestRequest (Method.GET);
            var asyncHandle = client.ExecuteAsync<EventResponse>(request, response => {
            //Here I see the json result
            string jsonString=response.Content;
            //The same
            Console.WriteLine(response.Content);
            //Nothing is shown here
            Console.WriteLine(response.Data.Events[0].id);
            });

有人能给我一些线索吗,告诉我如何查看json结果吗? 我认为我正在按照适当的步骤进行操作,但经过多个小时后我仍然无法获得任何结果。 谢谢

3个回答

6
你缺少将 JSON 字符串反序列化的最后一步。你可以使用 Json.net 将字符串反序列化为相应的对象。你可以这样做:
var eventResponse = JsonConvert.DeserializeObject<EventResponse>(jsonString);

这里是Newtonsoft的Json.Net链接:http://www.newtonsoft.com/json

1
RestSharp 包含 JSON 序列化器,因此那不是问题的根源。 - SKall
为了保持答案的实时性,我想指出,从103版本开始,RestSharp不再依赖Newtonsoft的JSON.Net。 - BardMorgan

5
很可能是JSON序列化程序无法反序列化回对象。看起来你正在尝试将VM和DTO合并到一个类中,我认为这不是一个很好的想法。尽可能使DTO简单。如果您将EventResponse更改为以下代码,那么您是否可以获得对象?
public class Event
{
    public int id { get; set; }
    public string name { get; set; }
    public string datefrom { get; set; }
    public string timeto { get; set; }
    public string price { get; set; }
    public string imagen { get; set; }
    public string desc { get; set; }
    public string info { get; set; }
    public int user { get; set; }
    public int place { get; set; }
    public string dateto { get; set; }
    public List<object> Eventcategories { get; set; }
}

public class EventResponse
{
    public List<Event> Events { get; set; }
}

4
那正是问题所在。我之前是手动制作模型,现在用了这个工具:http://json2csharp.com/,重新制作后就可以无障碍地进行解析了。 - Pablo Pardo
那个工具也救了我。格式化C#代码后就可以运行了!谢谢。 - Josh

2
这是使用Newtonsoft.Json.dll直接反序列化为特定实体/对象的方法,这是一个非常有用的库,可以从nugget安装。更多详细信息可以在以下链接找到:https://www.nuget.org/packages/Newtonsoft.Json/
userData = JsonConvert.DeserializeObject<GRALUserData>(response.Content,
                    new JsonSerializerSettings
                    {
                        PreserveReferencesHandling = PreserveReferencesHandling.Objects
                    });

3
RestSharp 包含 JSON 序列化器,因此这不是问题的根源。 - SKall
1
为了保持答案的最新性,我想指出自103版本以来,RestSharp不再依赖于Newtonsoft的JSON.Net。 - BardMorgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接