解析 Json 字符串以查找相同元素的所有值

Posted

技术标签:

【中文标题】解析 Json 字符串以查找相同元素的所有值【英文标题】:Parse Json string to find all values of same element 【发布时间】: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 适合您,请将其标记为已接受。 【参考方案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; 

【讨论】:

以上是关于解析 Json 字符串以查找相同元素的所有值的主要内容,如果未能解决你的问题,请参考以下文章

[对象值使用JSON解析显示具有相同名称的对象和字符串

查找 JSON 对象大小而不将其解析为字符串

如何从JSON字符串获取值的所有JSON路径列表?

Hive 从一个长的 concat json 字符串中解析 json 元素

仅使用字符串和值解析 JSON 对象

如何使用 Jackson 解析 JSON 数组项中的原始值?