如何返回具有重复键的特定json值

时间:2012-06-06 19:18:39

标签: c# json json.net

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

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

3 个答案:

答案 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)

您的代码存在两个问题:

  1. 您错误地使用了ToString()。如果您隐式将string转换为JToken,则生成的JToken包含文本,而不是字符串所代表的对象。所以你应该摆脱对ToString()
  2. 的号召
  3. Last不返回nest2的值,它返回整个属性。要获得最后一个属性的值,您可以使用token.PropertyValues().Last()
  4. 之类的内容

    因此,您的代码可能如下所示:

    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"
     }
  ]
} ]