解析 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 字符串以查找相同元素的所有值的主要内容,如果未能解决你的问题,请参考以下文章