1

我有以下 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();
    }

我猜我可能忘记了一些简单的事情,任何帮助都会很棒

4

3 回答 3

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);
    }
}
于 2012-06-06T20:41:23.617 回答
2

您的代码有两个问题:

  1. 你使用ToString()不正确。如果您像您一样将 a 隐式转换为stringJToken则结果JToken包含text,而不是字符串表示的对象。所以你应该摆脱对ToString().
  2. 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>(),因为我认为它在这里更有意义,即使它不会改变结果。

于 2012-06-06T23:04:48.133 回答
0

也许你有一个误解。在这种情况下,有两个具有两个属性的主体对象:

Principal {
  var1;
  var2
}

属性也一样。你需要一个对象数组吗?

[ { "objects" :
   [ 
    {
      "attributes" : {
         "type" : "irrelevant",
         "url" : "irrelevant"
      },
      "key" : "value1"
    },
    {
      "attributes" : {
      "type" : "irrelevant",
      "url" : "irrelevant"
       },
      "key" : "value2"
     }
  ]
} ]
于 2012-06-06T19:32:52.267 回答