【问题标题】:Json.NET: Deserialization with list of objectsJson.NET:使用对象列表进行反序列化
【发布时间】:2011-09-23 01:59:00
【问题描述】:

我正在处理来自我的 Windows Phone 7 客户端上的服务的 JSON 响应(如下所示)。我正在使用 Json.NET 将它们反序列化为一个包含产品列表的对象。

但是在我反序列化之后,当我查看我的 serviceresponse 对象时,我可以看到 2 个产品的列表。但是当我展开产品对象时,产品(名称、到期日期...等)下的字段都是空的。

我想我的问题在于我定义服务响应类的方式。有人可以帮我解决问题并获得正确的输出。

我的反序列化代码:

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;
}

【问题讨论】:

    标签: c# json list json.net deserialization


    【解决方案1】:

    从您的 json 中删除 "product" 对象名称,因为这只是没有命名项的数组。

    { "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" 
    
    } 
    
    }
    

    【讨论】:

    • Json.NET 正在添加额外的产品类,以便它知道如何反序列化为 List。如果列表不是通用类型,您所指的产品应该会消失。
    • 在不修改从服务器收到的响应消息的情况下,我能做些什么吗?
    • @fabraham 你可以这样写:public class ProductContainer{public product product;} 来包装你的原始产品,并像这样替换serviceresponse 中的产品字段:public List&lt;ProductContainer&gt; products;。虽然我不确定这是最好的解决方案,但也许有一些反序列化标志或其他东西。
    • 使用 Product[] 而不是 List 肯定会改变反序列化。
    【解决方案2】:

    我最终这样做了。我发现了这个很棒的工具Jsonclassgenerator。它可以为输入的 Json 字符串生成 C# 类。然后我打开生成的类,发现类是如何布局的。并相应地修改了我的 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;
    }
    

    【讨论】:

    • 这是一个很棒的工具。感谢您的链接
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多