用数字行进行序列化JSON



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

我在这里看到了一些问题。

首先,您的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,以避免混淆。)

第二,OrderItems类中的Items属性与JSON不匹配。在JSON中,它被命名为order_items。由于它们不匹配,因此当您应对时,您将获得零值。您要么需要重命名属性,要么使用[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

相关内容

  • 没有找到相关文章

最新更新