有没有更简单的方法来使用newtonsoft获取以下json中的键名值

时间:2017-12-08 02:13:01

标签: c# json json.net

假设我们有JSON如下:

{
  "Group1": ["Value1", "Value5"],
  "Group2": ["Value4", "Value11", "Value12", "Value9"],
  "Group3": ["Value2"]
}

鉴于列表中的值为“Value1”,我需要获取相应的密钥名称“Group1”。

有没有更简单的方法呢?

我尝试了什么:

var json = "{\r\n  \"Group1\": [\"Value1\", \"Value5\"],\r\n  \"Group2\": [\"Value4\", \"Value11\", \"Value12\", \"Value9\"],\r\n  \"Group3\": [\"Value2\"]\r\n}";

var jObject = JObject.Parse(json);

var group1 = jObject["Group1"].ToObject<List<string>>();
var group2 = jObject["Group2"].ToObject<List<string>>();
var group3 = jObject["Group3"].ToObject<List<string>>();

var value = group1.Contains("Value1") ? "Group1" : "Invalid";

2 个答案:

答案 0 :(得分:3)

这就是你需要的:

反序列化为Dictionary<string, List<string>>

过滤并获取密钥。

var data = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(json);

string key = data.Where(kvp => kvp.Value.Contains(searchValue))
                 .Select(kvp => kvp.Key)
                 .FirstOrDefault();

答案 1 :(得分:1)

与Daniel Tran的答案相似,如果你想继续使用JObject,你可以这样做:

var jObject = JObject.Parse(json);

var key = jObject.Properties()
                 .Where(p => p.Value.Children().Contains("Value1"))
                 .Select(p => p.Name)
                 .FirstOrDefault();

小提琴:https://dotnetfiddle.net/14mgtV