2

我对 Newtonsoft.JsonJObject界面有点困惑。假设我需要访问'foo'我的 JSON 对象中第一个孩子的属性。我的 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是未知的,所以我不能在我的代码中使用它。

4

3 回答 3

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"]);
于 2018-05-21T08:59:58.937 回答
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']);
于 2018-05-21T08:57:38.500 回答
0

你可以做这样的事情。

var jtk = o.Descendants().First().Children().First().Value<string>("foo")
于 2018-05-21T09:00:13.483 回答