Newtonsoft JSON在运行时获取特定的嵌套属性

时间:2015-04-15 14:31:49

标签: c# json

如何在运行时从JSON对象获取特定嵌套属性的值? 这是一个说明我想要做的事情的例子(没有错误检查,因为它只是一个简单的例子):

JSON对象:

string jsonobj = "{ 
    "Header":"someHeader",
    "FirstNest":{
        "Property1":"123",
        "property2":"321",
        "SecondNest":{
            "property3":"456",
            "property4":"789"
        }
    }

在我的代码中,我会有这样的事情:

string read = Console.ReadLine();

用户将输入的内容,例如FirstNest.Property1,然后我将返回123。我可以这样做:

JObject msg = JObject.Parse(jsonobj);
string[] tosearch = read.Split('.'); // This would give me FirstNest Property1
string tofind = (string)msg[tosearch[0]][tosearch[1]]; 

当用户想要访问FirstNest.SecondNest.property3时会出现问题,因为我的硬编码方法只能使用两个字符串。如何在运行时构建这样的“查询”方法,我可以使用它来搜索任何属性? 一个灵魂就是创造一个功能

GetProperty(JObject msg, string str1, string str2)
{
    return (string)msg[str1][str2];
}

然后是另一个,它将输入3个字符串:

GetProperty(JObject msg, string str1, string str2, string str3)
{
    return (string)msg[str1][str2][str3];
}

,然后另一个,它将4个字符串作为输入,依此类推......这似乎不是一个有效的解决方案。

1 个答案:

答案 0 :(得分:4)

这个怎么样(为简洁而排除异常处理):

public string GetJsonPropertyValue(string json, string query)
{
    JToken token = JObject.Parse(json);

    foreach(string queryComponent in query.Split('.'))
    {
        token = token[queryComponent];
    }
    return token.ToString();
}

鉴于您的示例中的json,搜索此FirstNest.SecondNest.property3将返回456。您应该包括任何必要的用户输入验证和异常处理。