【问题标题】:can't deserialize JSON correct无法正确反序列化 JSON
【发布时间】:2011-10-20 23:20:49
【问题描述】:

我有课

[DataContract]
    public class restaurant
    {
        public restaurant() {}

        public restaurant(string Address, string Description, int Id, float Latitude, float Longitude, string Name,
            string OpeningHours, string Phone, string Sandwich, string Price, string UpdatedAt , string Website, float Score, int RatingCount, string ThumbnailUrl)
        {
            address = Address;
            description = Description;
            id = Id;
            latitude = Latitude;
            longitude = Longitude;
            name = Name;
            opening_hours = OpeningHours;
            phone = Phone;
            sandwich = Sandwich;
            price = Price;
            updated_at = UpdatedAt;
            website = Website;
            score = Score;
            rating_count = RatingCount;
            thumbnail_url = ThumbnailUrl;

        }


        [DataMember]
        public string address { get; set; }
        [DataMember]
        public string description { get; set; }
        [DataMember]
        public int id { get; set; }
        [DataMember]
        public float latitude { get; set; }
        [DataMember]
        public float longitude { get; set; }
        [DataMember]
        public string name { get; set; }
        [DataMember]
        public string opening_hours { get; set; }
        [DataMember]
        public string phone { get; set; }
        [DataMember]
        public string sandwich { get; set; }
        [DataMember]
        public string price { get; set; }
        [DataMember]
        public string updated_at { get; set; }
        [DataMember]
        public string website { get; set; }
        [DataMember]
        public float score { get; set; }
        [DataMember]
        public int rating_count { get; set; }
        [DataMember]
        public string thumbnail_url { get; set; }

    }

和一个 JSON 字符串:

string json = @"{""restaurant"":{""address"":""blablabla"",""description"":""blablabla"",""id"":6,""latitude"":12.1,""longitude"":-12.3,
                                    ""name"":""blablabla"",""opening_hours"":""Mon-Fri: 12pm-2:30pm\r\n                  6:30pm-11pm \r\nSat: 12-3:30pm/6:30-11pm \r\nSun: 12-9pm"",""phone"":""123456"",""price"":""1"", ""sandwich"":""blablabla"",""updated_at"":""2011-10-10T21:40:17Z"",
                                    ""website"":""blablabla"",""score"":4.3,""ratings_count"":3,""thumbnail_url"":""http://website.com/1.jpg""}}";

我正在尝试使用此代码进行反序列化:

restaurant LR;

            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
            {
                DataContractJsonSerializer serializer =
                        new DataContractJsonSerializer(typeof(restaurant));

                LR= (restaurant)serializer.ReadObject(ms);
            }

但它不起作用!奇怪的是,当我尝试反序列化它时它没有显示错误(所以 json 很好,如果我故意将 json 搞砸,它会在运行时显示错误),但是餐厅对象是空的。我做错了什么?

【问题讨论】:

    标签: c# .net json datacontractserializer


    【解决方案1】:

    根据您的餐厅类,我认为这是您拥有的代码将反序列化的 json:

    string json = @"{""address"":""blablabla"",""description"":""blablabla"",""id"":6,""latitude"":12.1,""longitude"":-12.3,
                                    ""name"":""blablabla"",""opening_hours"":""Mon-Fri: 12pm-2:30pm\r\n                  6:30pm-11pm \r\nSat: 12-3:30pm/6:30-11pm \r\nSun: 12-9pm"",""phone"":""123456"",""price"":""1"", ""sandwich"":""blablabla"",""updated_at"":""2011-10-10T21:40:17Z"",
                                    ""website"":""blablabla"",""score"":4.3,""ratings_count"":3,""thumbnail_url"":""http://website.com/1.jpg""}";
    

    不过,我不能谈论日期。有时他们会抛出文化事业。

    编辑:要使其序列化您的 json,您可以创建一个外部类 rest。喜欢,

    public class rest
    {
        public restaurant restaurant { get; set; }
    }
    

    那么您的反序列化代码也需要更改为:

    rest LR;
    
    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        DataContractJsonSerializer serializer =
                        new DataContractJsonSerializer(typeof(rest));
    
        LR = (rest)serializer.ReadObject(ms);
    }
    

    重要提示 如果您可以包含许多 [restaurant],例如

    {"restaurant":[{""address"":"blah1", ...}, {""address"":"blah2", ...}]}
    

    ,那么您可能需要将 rest 类中的成员 restaurant 设为 array,如下所示:

    public class rest
    {
        public restaurant[] restaurant { get; set; }
    }
    

    【讨论】:

    • 成功了!谢谢!如何修改我的代码,以便反序列化器反序列化 json? json是外部的,所以我不能修改它!你能帮忙吗?
    • @BadescuAlexandru:我编辑了我的答案,向您展示如何处理 json
    • 顺便说一句,如果我的 json 类似于 [{"restaurant":{""address"":"blah1", ...}, restraurant:{""address"":"blah2" , ...}}] ,我该怎么做呢?
    • 更改休息LR;休息[] LR;然后 typeof(rest) 到 typeof(rest[]) 和 LR = (rest)serializer.ReadObject(ms) 到 LR = (rest[])serializer.ReadObject(ms)
    • @BadescuAlexandru:你确定你的 JSON 格式正确吗?像下面这样的 sn-p 应该使用我发布的代码正确反序列化: [{""restaurant"":{""address"":""blah1"", ...}}, {""restaurant"": {""地址"":""blah2"", ...}}]。确保大括号正确匹配。 {""restaurant"":{""address"":""blah1"", ...}} 包含一个完整的餐厅对象。注意最后两个}}。第一个关闭内部{,另一个关闭“餐厅”之前的{
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2019-05-02
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多