我试图使用JSON.NET将一些JSON反序列化为一个列表;但是,有一些方式:
这是JSON:
"payment_info": {
"fb_id": "",
"order_items": {
"0": {
"product_id": "4534",
"type": "product",
"shipping_cost_per_item": "1.00",
"quantity": "3",
"price_each": "10.00",
"price_total": "30.00"
}
},
这是我的班级:
public class OrderItem
{
public string product_id { get; set; }
public string type { get; set; }
public string shipping_cost_per_item { get; set; }
public string quantity { get; set; }
public string price_each { get; set; }
public string price_total { get; set; }
}
public class OrderItems
{
public List<OrderItem> Items { get; set; }
}
如何告诉转换器忽略0?每个订单商品将有1,2,3。
答案 0 :(得分:1)
我在这里看到一些问题。
首先,您的JSON无效;它似乎只是一个片段。有效,完整的JSON将如下所示。 (我添加了括号,删除了尾随的逗号并平衡了payment_info
对象的大括号。)
{
"payment_info": {
"fb_id": "",
"order_items": {
"0": {
"product_id": "4534",
"type": "product",
"shipping_cost_per_item": "1.00",
"quantity": "3",
"price_each": "10.00",
"price_total": "30.00"
}
}
}
}
由于您的片段包含在一个对象中,因此您需要一个相应的顶级类来反序列化。该类需要payment_info
属性来保存现在的OrderItems
类。 (如果可能的话,我建议将该类重命名为PaymentInfo
以避免混淆。)
其次,Items
类中的OrderItems
属性与JSON不匹配。在JSON中,它被命名为order_items
。由于它们不匹配,因此在反序列化时将获得null值。您需要重命名该属性或使用[JsonProperty]
属性指定JSON属性名称。
第三,JSON中的order_items
属性不是列表;这是一个对象。因此,如果您尝试将其反序列化为列表(一旦修复属性名称),您将收到错误。处理这种情况的常用解决方案是使用Dictionary<string, T>
而不是List<T>
。
总而言之,如果你按照这样的方式制作课程:
public class RootObject
{
public PaymentInfo payment_info { get; set; }
}
public class PaymentInfo
{
public Dictionary<string, OrderItem> order_items { get; set; }
}
public class OrderItem
{
public string product_id { get; set; }
public string type { get; set; }
public string shipping_cost_per_item { get; set; }
public string quantity { get; set; }
public string price_each { get; set; }
public string price_total { get; set; }
}
然后你可以像这样反序列化:
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);
foreach (OrderItem item in root.payment_info.order_items.Values)
{
Console.WriteLine("product id: " + item.product_id);
Console.WriteLine("type: " + item.type);
Console.WriteLine("shipping cost per item: " + item.shipping_cost_per_item);
Console.WriteLine("quantity: " + item.quantity);
Console.WriteLine("price per item: " + item.price_each);
Console.WriteLine("total price: " + item.price_total);
}