使用System.Json迭代JSON

本文关键字:JSON 迭代 Json System 使用 | 更新日期: 2023-09-27 18:12:02

我正在探索。net 4.5 System.Json库的功能,但没有太多文档,而且由于流行的JSON,搜索起来相当棘手。网络图书馆。

我想知道如何循环一些JSON例如:

{ "People": { "Simon" : { Age: 25 }, "Steve" : { Age: 15 } } }

我有一个JSON字符串,我想遍历并显示每个人的年龄。

所以首先我要做:

var jsonObject = JsonObject.Parse(myString);

但是我不知道下一步该做什么。我很惊讶,解析方法返回一个JsonValue而不是JsonObject。

我真正想做的是:

foreach (var child in jsonObject.Children)
{
  if (child.name == "People")
{
 // another foreach to loop over the people
 // get their name and age, eg. person.Name and person.Children.Age (LINQ this or something)
}
}

任何想法?

使用System.Json迭代JSON

既然公认的答案对我没有多大帮助,因为它是典型的"使用这个库会更好"的答案之一,我就明白了。

是的,

JsonObject.Parse(myJsonString);

返回一个JsonValue对象,该对象是System.Json中所有Json*类的基类。当你调用JsonObject.Parse(…)时,JsonValue.Parse()实际上是由于继承而被调用的。

来迭代JsonObject,你可以使用:

var jsonObject = JsonValue.parse(jsonString);
foreach (KeyValuePair<string, JsonValue> value in jsonObject)
{
    Console.WriteLine("key:" + value.Key);
    Console.WriteLine("value:" + value.Value);
}

我没有试过如果它是JsonArray是否也能工作但如果它是JsonArray那么你可能想用经典的for I:

for (var i = 0; i < jsonObject.Count; i++)
{
    Console.WriteLine("value:" + jsonObject[i]);
}

如果你不知道它是数组还是对象你可以在

之前检查
if (jsonObject.GetType() == typeof JsonObject){
    //Iterate like an object 
}else if (jsonObject.GetType() == typeof JsonArray){
    //iterate like an array
}

使用Json。Net和一些Linq

string json = @"{ ""People"": { ""Simon"" : { Age: 25 }, ""Steve"" : { Age: 15 } } }";
var people =  JsonConvert.DeserializeObject<JObject>(json)["People"];
var dict = people.Children()
                 .Cast<JProperty>()
                 .ToDictionary(p => p.Name, p => p.Value["Age"]);

请使用json.net库,它比系统好得多。json本身

urclassobj = await JsonConvert.DeserializeObjectAsync<urclass>(json string)

然后在对象列表中使用foreach with linq

 foreach(var details in urclassobj
                        .Select((id) => new { id= id})
                        )
 {
   Console.WriteLine("{0}", details.id);
  } 

 string json2Send = await JsonConvert.SerializeObjectAsync(urclassobject);