【问题标题】:Parse Json string to find all values of same element解析 Json 字符串以查找相同元素的所有值
【发布时间】:2021-11-16 06:30:19
【问题描述】:

我有一个如下的json。

{
    "name": "",
    "id": "test1",
    "properties": {
        "name1": [
            {
                "id": "test2",
            },
            {
                "id": "test3"
                }
            }
        ],
        "name3": [
            {
                "id": "test4"


            }
        ],
        "name5": [
            {
                "id": "test7"
            }
        ],
        "name7": [
            {
                "id": "test8"
            }
        ]
    }
}

在上面的 JSON 中。我希望提取所有具有“id”的属性的值。所以最后我需要一个 id 值如下的列表。

{"test2", "test3","test4","test7","test8"}

我如何在 C# 中实现这一点。 感谢您的任何建议?

【问题讨论】:

  • 你用的是什么 json 库?
  • 我尝试通过 JsonConvert 将其转换为动态类型。但我找不到如何处理这种情况?
  • 我还希望收到的响应中包含“test1”。如下。 {"test1","test2","test3","test4","test7","test8"}
  • 请查看更新。
  • 很高兴为您提供帮助。如果 anwser 适合您,请将其标记为已接受。

标签: c# arrays json string object


【解决方案1】:

根据您提到的JsonConvert,您似乎正在使用Json.NET。所以其中一种选择是使用 json 路径来提取所需的值:

var js_str= ....;
var jToken = JToken.Parse(js_str);  
var result = jToken.SelectTokens("$.properties.*.[*].id")
    .Values()
    .Select(value => value.Value<string>())
    .ToList();

或者你可以用LINQ查询你的json。

或者创建代表您的数据的模型。字典有一个非常普遍的约定来表示对象,所以这样的事情会起作用:

public class Root
{
    public Dictionary<string, List<Obj>> Properties { get; set; }
}

public class Obj
{
    public string Id { get; set; }
}

var deserialized = JsonConvert.DeserializeObject<Root>(js_str);
var result = deserialized.Properties
    .Values
    .SelectMany(v => v)
    .Select(obj => obj.Id)
    .ToList();

UPD

要获取名称 == id 的所有属性的值,您可以这样做:

var res = JObject.Parse(js_str)
    .Descendants()
    .OfType<JProperty>()
    .Where(p => p.Name == "id")
    .Select(p => p.Value.ToString())
    .ToList();

或更新 Root 模型以具有 Id 属性。

【讨论】:

    【解决方案2】:

    使用 JToken.Parse 不需要创建类,但我猜你可能不仅需要 ID,还需要一些其他数据。在这种情况下,试试这个使用 JsonConvert 的代码

    var json="{\"name\":\"\",\"id\":\"test1\",\"properties\":{\"name1\":[{\"id\":\"test2\"},{\"id\":\"test3\"}],\"name3\":[{\"id\":\"test4\"}],\"name5\":[{\"id\":\"test7\"}],\"name7\":[{\"id\":\"test8\"}]}}";
    
    var jD=JsonConvert.DeserializeObject<Root>(json);
        
    var ids=jD.properties.Select(p =>p.Value.Select(v =>v.id ) ).SelectMany(i=> i).ToList();
    

    输出

    ["test2", "test3","test4","test7","test8"]
    

    public class Root
    {
        public string name { get; set; }
        public string id { get; set; }
        public Dictionary<string,Name[]> properties { get; set; }
    }
    public class Name
    {
        public string id { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2019-04-24
      • 2023-04-01
      相关资源
      最近更新 更多