如何使用C#在Json上按键名获取值列表

时间:2019-09-04 05:06:30

标签: c# json json.net

我有一个如下的Json文件

{
  "objectId": "123",
  "properties": {
    "objectId": "456"
  },
  "variables": [
    {
      "objectId": "789"
    },
    {
      "objectId": "012"
    }
  ]

}

我想获取列表中的所有'objectId',例如[“ 123”,“ 456”,“ 789”,“ 012”]

我尝试如下

var body = JObject.Parse(jsonString); //using Newtonsoft library
var list = body.Properties().Where(p => p.Name == "objectId").Select(p => p.Value).ToList();

我也尝试了以下方式

var list = new List<string>();
            foreach(var prop in body.Properties())
            {
                if(prop.Name == "objectId")
                {
                    list.Add(prop.Value.ToString());
                }
            }

但是在这里,我仅获得第一级属性。

4 个答案:

答案 0 :(得分:1)

 IEnumerable<JToken> AllTokens(JObject obj)
        {
            var toSearch = new Stack<JToken>(obj.Children());
            while (toSearch.Count > 0)
            {
                var inspected = toSearch.Pop();
                yield return inspected;
                foreach (var child in inspected)
                {
                    toSearch.Push(child);
                }
            }
        }

然后,您可以使用linq过滤并执行操作:

    var tokens = AllTokens(body);
    var data = tokens.Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "objectId")
    .Select(x=> ((JProperty)x).Value.Value<string>()).ToList();

答案 1 :(得分:1)

使用DescendantsAndSelf()。OfType()获取所有JProperty,然后使用LINQ进行过滤。

var root = (JContainer)JToken.Parse(json);
            var list = root.DescendantsAndSelf().OfType<JProperty>().Where(p => p.Name == "objectId").Select(p => p.Value.Value<string>());
            Console.WriteLine(string.Join(",", list.ToArray()));

答案 2 :(得分:0)

我不知道JSON对象足够好,无法看到使用它们的简单解决方案,但是使用XML我将是一个简单的任务。因此,绕道而行是一个解决方法。

    XElement Data = JsonConvert.DeserializeXNode(JsonString);
    var List = Data.Descendants("objectId");

答案 3 :(得分:0)

您可以尝试以下操作:

var jsonObject = jsonObject.Parse(json);

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