使用JSON.NET访问第一个孩子的优雅方式

时间:2018-05-21 08:50:26

标签: c# json.net

我对Newtonsoft.Json JObject界面有些困惑。假设我需要访问JSON对象中第一个子节点的'foo'属性。我的C#代码:

string json = @"{
    'someUnknownKey': { 'foo': 'bar' }
}";

JObject o = JObject.Parse(json);

JObject child = o.First.ToObject<JProperty>().Value.ToObject<JObject>();
string s = child["foo"].ToObject<string>();

这样做有效,但是如果没有JProperty / JObject次转换,是否有更优雅的方法呢?

编辑:我想强调一下,密钥名称someUnknownKey未知,因此我无法在我的代码中使用它。

3 个答案:

答案 0 :(得分:2)

我相信您确实需要 转换来表明您希望第一个子令牌成为属性,但您可以比当前代码更简单地执行此操作:

string json = @"{
    'someUnknownKey': { 'foo': 'bar' }
}";

JObject root = JObject.Parse(json);
Console.WriteLine(((JProperty) root.First).Value["foo"]);

或者稍微清楚一点:

JObject root = JObject.Parse(json);
JProperty property = (JProperty) root.First;
Console.WriteLine(property.Value["foo"]);

另一种选择是使用Properties()方法来请求第一个属性而不是第一个子令牌。这样你就不需要任何转换了。

JObject root = JObject.Parse(json);        
Console.WriteLine(root.Properties().First().Value["foo"]);

答案 1 :(得分:0)

您可以将json对象查询为动态:

string json = @"{
    'someUnknownKey': { 'foo': 'bar' }
}";

dynamic o = JArray.Parse(json);

string child = o.someUnknownKey.foo;

在这里查看参考https://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm

或者,您可以使用[]访问json属性:

JObject o = JObject.Parse(json);
string value = (string)(o['someUnknownKey']['foo']);

答案 2 :(得分:0)

你可以这样做。

var jtk = o.Descendants().First().Children().First().Value<string>("foo")