【问题标题】:Deserialize JSON with RESTSharp C#使用 RESTSharp C# 反序列化 JSON
【发布时间】:2015-06-01 01:07:52
【问题描述】:

我正在尝试在 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:...

正如我所读到的,我创建了两个类,一个用于对象(事件),另一个用于 JSON 响应(事件响应) 第二个只有一个事件列表:

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

而Event类拥有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 结果的线索? 我想我正在遵循适当的步骤,但经过几个小时我什么也达不到。 谢谢

【问题讨论】:

    标签: c# json xamarin


    【解决方案1】:

    您错过了反序列化 JSON 字符串的最后一步。您可以使用 Json.net 将字符串反序列化为适当的对象。你可以这样做:

    var eventResponse = JsonConvert.DeserializeObject<EventResponse>(jsonString);
    

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

    【讨论】:

    • RestSharp 包含 JSON 序列化程序,因此这不是问题的根源。
    • 为了使答案保持最新,我要指出的是,从版本 103 开始​​,RestSharp 不再包含对 Newtonsoft 的 JSON.Net 的依赖。
    【解决方案2】:

    JSON 序列化程序很可能无法反序列化回对象。看起来您正在尝试将 VM 和 DTO 组合到一个类中,而 IMO 并不是一个好主意。使 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; }
    }
    

    【讨论】:

    • 这正是问题所在。我是手工制作模型的,我用这个工具又做了一次:json2csharp.com 现在我可以毫无问题地解析它了。
    • 这些工具也救了我。正确格式化 c# 就可以了!谢谢。
    【解决方案3】:

    这是您可以使用 Newtonsoft.Json.dll 直接反序列化为特定实体/对象的方法,这是一个非常有用的库,可以从 nugget 安装。您可以在以下链接中找到更多详细信息:https://www.nuget.org/packages/Newtonsoft.Json/

    userData = JsonConvert.DeserializeObject<GRALUserData>(response.Content,
                        new JsonSerializerSettings
                        {
                            PreserveReferencesHandling = PreserveReferencesHandling.Objects
                        });
    

    【讨论】:

    • RestSharp 包含 JSON 序列化程序,因此这不是问题的根源。
    • 为了使答案保持最新,我要指出的是,从版本 103 开始​​,RestSharp 不再包含对 Newtonsoft 的 JSON.Net 的依赖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多