在任意JSON中的任何位置查找特定元素

时间:2015-07-16 05:39:38

标签: c# json json.net

我是JSON.NET的新手,不知道如何做到这一点。

我有CartItem课程,我需要实施左GetAllCartItemsFromArbitraryJson(string jsonStr),如下所示:

class CartItem {
  public int Id;
  public int Qty;
}

List<CartItem> items = GetAllCartItemsFromArbitraryJson(jsonStr);

我所知道的是jsonStr在某个地方包含一个或多个cartitems(我不知道有多深),例如。

{
  ... : {
    "cartitems": [{
        "id": "1",
        "qty": "1"
      },{
        "id": "2",
        "qty": "5"
      }
    ]
  },
  ... : {
    ... : {
      ...,
      "cartitems": [{
          "id": "10",
          "qty": "2"
        }
      ]
    }
  }
}

此功能需要收集所有cartitems并将其放入List<CartItem>

List<CartItem> GetAllCartItemsFromArbitraryJson(string jsonStr) {
  JObject json = JObject.Parse(jsonStr);
  // then what...?
}

因此List<CartItem>将包含:

Id  Qty
1   1
2   5
10  2

你会怎样在C#中做到?

2 个答案:

答案 0 :(得分:2)

这是一个有效的解决方案:

List<CartItem> GetAllCartItemsFromArbitraryJson(string jsonStr) {
  JObject json = JObject.Parse(jsonStr);

  return json.Descendants().OfType<JProperty>()  // so we can filter by p.Name below
             .Where(p => p.Name == "cartitems")
             .SelectMany(p => p.Value)           // selecting the combined array (joined into a single array)
             .Select(item => new CartItem {
                 Id  = (int)item["id"],
                 Qty = (int)item["qty"]
             }).ToList();
}

希望对某人有所帮助 我是JSON的新手,通过试用获得了这一点。错误。所以让我知道它是否可以改进:)

答案 1 :(得分:1)

解析为动态并遍历项目。

public List<CartItem> PostAllCartItemsFromArbitraryJson(string jsonStr)
{
    List<CartItem> AllCartItems = new List<CartItem>();
    try
    {
        dynamic BaseJson = JObject.Parse(jsonStr.ToLower());

        CheckForCarts(AllCartItems, BaseJson);
    }
    catch (Exception Error)
    {
    }

    return AllCartItems;
}

private void CheckForCarts(List<CartItem> AllCartItems, dynamic BaseJson)
{
    foreach (dynamic InnerJson in BaseJson)
    {
        if (InnerJson.Name == "cartitems")
        {//Assuming this is an [] of cart items
            foreach (dynamic NextCart in InnerJson.Value)
            {
                try
                {
                    CartItem FoundCart = new CartItem();
                    FoundCart.Id = NextCart.id;
                    FoundCart.Qty = NextCart.qty;
                    AllCartItems.Add(FoundCart);
                }
                catch (Exception Error)
                {
                }
            }
        }
        else if (InnerJson.Value is JObject)
        {
            CheckForCarts(AllCartItems, InnerJson.Value);
        }
    }
}

public class CartItem
{
    public int Id;
    public int Qty;
}

对于您的样本输入,这会生成:

  

[{ “ID”:1, “数量”:1},{ “ID”:2 “数量”:5},{ “ID”:10, “数量”:2}]