不能正确反序列化JSON

本文关键字:JSON 反序列化 不能 | 更新日期: 2023-09-27 18:12:06

我有一个class

[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搞砸了,它在运行时显示一个错误),但是餐厅对象是空的。我做错了什么?

不能正确反序列化JSON

根据你的餐厅类,我认为这是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""}";

我不能说日期。有时他们会因为文化而呕吐。

EDIT:要序列化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":[{""address"":"blah1", ...}, {""address"":"blah2", ...}]}
,则可能需要将rest类中的成员restaurant作为数组,如下所示:
public class rest
{
    public restaurant[] restaurant { get; set; }
}