我对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
未知,因此我无法在我的代码中使用它。
答案 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")