我有以下JSON
{
"nest1" : {
"attributes" : {
"type" : "irrelevant",
"url" : "irrelevant"
},
"key" : "value1"
},
"nest2" : {
"attributes" : {
"type" : "irrelevant",
"url" : "irrelevant"
},
"key" : "value2"
}
}
我已经尝试了如下方法来获取第二个key
的值,但这会抛出一个InvalidOperationException
。 并显示以下错误消息:
无法访问 Newtonsoft.Json.Linq.JProperty 上的子值。
string value = getJson(json, "key");
该方法看起来像
public string getJson(string json, string name)
{
JObject token = JObject.Parse(json);
JToken jtoken = token.Last.ToString();
return jtoken[name].toString();
}
我猜可能有一些简单的事情我忘记了,任何帮助都会很棒
你的代码有两个问题:
- 您不正确地使用了
ToString()
。如果像您一样将string
隐式转换为JToken
,则生成的JToken
将包含文本,而不是字符串表示的对象。所以你应该摆脱对ToString()
的呼吁。 -
Last
不返回nest2
的值,它返回整个属性。若要仅获取最后一个属性的值,可以使用类似token.PropertyValues().Last()
的内容。
因此,您的代码可能如下所示:
public static string GetJson(string json, string name)
{
JObject obj = JObject.Parse(json);
JToken lastValue = obj.PropertyValues().Last();
return lastValue[name].Value<string>();
}
我还更改了最后一个ToString()
Value<string>()
,因为我认为这里更有意义,即使它不会改变结果。
dynamic dynObj = JsonConvert.DeserializeObject(json);
foreach (var item in dynObj)
{
foreach (var subitem in item)
{
Console.WriteLine("url:" + subitem.attributes.url);
Console.WriteLine("key:" + subitem.key);
}
}
也许你有一个误解。在本例中,有两个具有两个属性的主体对象:
Principal {
var1;
var2
}
属性也是如此。你需要一个对象数组吗?
[ { "objects" :
[
{
"attributes" : {
"type" : "irrelevant",
"url" : "irrelevant"
},
"key" : "value1"
},
{
"attributes" : {
"type" : "irrelevant",
"url" : "irrelevant"
},
"key" : "value2"
}
]
} ]