我有以下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();
}
我猜我可能会忘记一些简单的事情,任何帮助都会很棒
答案 0 :(得分:2)
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);
}
}
答案 1 :(得分:2)
您的代码存在两个问题:
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>()
,因为我觉得这里更有意义,即使它不会改变结果。
答案 2 :(得分:0)
也许你有一种误解。在这种情况下,有两个主要对象具有两个属性:
Principal {
var1;
var2
}
属性相同。你需要一个对象数组吗?
[ { "objects" :
[
{
"attributes" : {
"type" : "irrelevant",
"url" : "irrelevant"
},
"key" : "value1"
},
{
"attributes" : {
"type" : "irrelevant",
"url" : "irrelevant"
},
"key" : "value2"
}
]
} ]