我是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#中做到?
答案 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}]