JSON JObject检测多个数组对象

时间:2014-04-09 07:45:49

标签: c# json

有没有办法从Json Response中提取所有数组,我不知道响应中每个数组的名称。

我基本上想要检测JSON中的数组对象的数量,然后分别访问每个对象。

我正在动态执行此操作,因此一个响应可能只包含“employees”数组,下一个响应可能包含两者。两个数组的结构将始终保持不变。

{
    "employees": [
        {
            "firstName": "John",
            "lastName": "Doe"
        },
        {
            "firstName": "Anna",
            "lastName": "Smith"
        },
        {
            "firstName": "Peter",
            "lastName": "Jones"
        }
    ],
    "employers": [
        {
            "firstName": "John",
            "lastName": "Doe"
        },
        {
            "firstName": "Anna",
            "lastName": "Smith"
        },
        {
            "firstName": "Peter",
            "lastName": "Jones"
        }
    ]
}

2 个答案:

答案 0 :(得分:1)

有一种更简单的方法可以做到这一点,不涉及创建类。

您可以使用JObject / JArray(在您的情况下为jObject)并使用JObject.Parse,它将返回一个JObject。这是从解析的json生成的树结构。

可能比创建改变需求的类更舒服。还有一个类似xpath的语法来导航键。

更新

var so = "{\"employees\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}],\"employers\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}]}";
var parsed = JObject.Parse(so);
foreach (KeyValuePair<string, JToken> pair in parsed)
{
    Debug.WriteLine(pair.Key);
    foreach (JToken childObject in pair.Value)
    {
        Debug.WriteLine(childObject["firstName"]);
        Debug.WriteLine(childObject["lastName"]);
    }
}

    // Or with Syntax i talked about: 
foreach (var token in parsed.SelectTokens("employees/"))
{
    Debug.WriteLine(token["firstName"]);
    Debug.WriteLine(token["lastName"]);
}

答案 1 :(得分:0)

首先,根据你的陈述,由于两个数组的结构总是保持不变,我们可以将结构定义为List<FullName>;鉴于此,

public class FullName
{
    public string firstName { get; set; }
    public string lastName { get; set; }
}

其次,由于您事先不知道响应中每个数组的名称,因此可以指定Dictionary之类的数据结构。

Fyki,我在这里使用Json.Net。所以请不要忘记提前添加参考文献。

请参阅以下代码:

// 'json' is in enquoted string format 
string  json = "{\"employees\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}],\"employers\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}]}";

var dictCategoryList = JsonConvert.DeserializeObject<Dictionary<string, List<FullName>>>(json);

其中dictCategoryList的类型为Dictionary<string, List<FullName>>

通过这种方式,您只需使用dictCategoryList.Count来检测JSON中的数组对象的数量,然后单独访问每个对象,如下所示:

foreach (var category in dictCategoryList)
{
    foreach (var item in category.Value)
    {
        Console.WriteLine(string.Format("First Name: {0}, Last Name: {1}", item.firstName, item.lastName));
    }
}