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