Json.NET: десериализация со списком объектов - PullRequest
1 голос
/ 23 сентября 2011

Я обрабатываю ответы JSON (отображаются ниже) от службы на моем клиенте Windows Phone 7. Я использую Json.NET для десериализации их в объект, который содержит список продуктов.

Но после десериализации, когда я заглянул в свой объект serviceresponse, я вижу список из 2 продуктов. Но когда я раскрываю объект product, все поля в product (Name, ExpiryDate ... и т. Д.) Становятся пустыми.

Полагаю, моя проблема в том, как я определил свой класс обслуживания. Может кто-нибудь помочь мне решить проблему и получить правильный вывод.

Мой код десериализации:

serviceresponse deserializedProduct = JsonConvert.DeserializeObject<serviceresponse>(json);

Моя строка ответа Json:

{ "serviceresponse" : 

{ "company" : "ford", "success" : "Yes", "products" : [
  {"product" : 

      {
        "Name": "Product 1",
        "ExpiryDate": "\/Date(978048000000)\/",
        "Price": "99.95",
        "Sizes": "1"
      }
  },
  {"product" : 
      {
        "Name": "Product 2",
        "ExpiryDate": "\/Date(1248998400000)\/",
        "Price": "12.50",
        "Sizes": "1"
      }
  }
], "callbackformore" : "No", "message" : "1" 

    } 
}

Мой класс обслуживания:

[DataContract]
public class serviceresponse
{
    [DataMember]
    public String company;
    [DataMember]
    public String success;
    [DataMember]
    public List<product> products;
    [DataMember]
    public String callbackformore;
    [DataMember]
    public String message;
}

[DataContract]
public class product
{
    [DataMember]
    public String Name;
    [DataMember]
    public String ExpiryDate;
    [DataMember]
    public String Price;
    [DataMember]
    public String Sizes;
}

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Удалите "product" имен объектов из вашего json, так как это просто массив без именованных элементов.

{ "serviceresponse" : 

{ "company" : "ford", "success" : "Yes", "products" : [
  {
    "Name": "Product 1",
    "ExpiryDate": "\/Date(978048000000)\/",
    "Price": "99.95",
    "Sizes": "1"
  },      
  {
    "Name": "Product 2",
    "ExpiryDate": "\/Date(1248998400000)\/",
    "Price": "12.50",
    "Sizes": "1"
  }
], "callbackformore" : "No", "message" : "1" 

} 

}
2 голосов
/ 27 октября 2011

Я закончил этим. Я нашел этот удивительный инструмент Jsonclassgenerator . Он может генерировать классы C # для входной строки Json. Затем я открыл сгенерированный класс и обнаружил, как эти классы размечены. И изменил мой Datacontract соответственно.

В моем случае мне нужно создать еще один контракт данных, окружающий список объектов. Так и должно быть.

[DataContract]
public class serviceresponse
{
    [DataMember]
    public String company;
    [DataMember]
    public String success;
    [DataMember]
    public List<product> products;
    [DataMember]
    public String callbackformore;
    [DataMember]
    public String message;
}
[DataContract]
public class product
{
    [DataMember(Name = "product")]
    public product2 _product;
}
[DataContract(Name = "product")]
public class product2
{
    [DataMember]
    public String Name;
    [DataMember]
    public String ExpiryDate;
    [DataMember]
    public String Price;
    [DataMember]
    public String Sizes;
}
...