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



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

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

你的代码有两个问题:

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

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

相关内容

  • 没有找到相关文章

最新更新