使用数字行反序列化JSON

时间:2015-05-05 20:51:15

标签: json json.net

我试图使用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。

1 个答案:

答案 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);
}

小提琴:https://dotnetfiddle.net/e0t8gX