反序列化通用 JSON 并使用其属性
Posted
技术标签:
【中文标题】反序列化通用 JSON 并使用其属性【英文标题】:Deserialize a generic JSON and use its properties 【发布时间】:2021-12-05 16:08:07 【问题描述】:我需要调用一个返回 JSON 的 API,该 JSON 可能会有所不同。 有时响应可能是这样的:
[
"name": "value"
]
其他时候
[
"property": "value"
]
甚至
[
"name": "value",
"status": "value",
"count": "value"
]
基本上,我需要检索此 JSON 中的所有值以供以后使用。
我试过了
var prova = JsonConvert.DeserializeObject<dynamic>(result);
,但我无法使用 ["indexName"] 访问属性,因为索引可能会因某些因素而异。有什么想法吗?
【问题讨论】:
您可以deserialize your JSON into a dictionary 然后循环遍历所有键值对或使用TryGetValue
检查您感兴趣的是否存在。
如上cmets中提到的,可以这样工作public void Save(dynamic content) var events = content.ToString(); Dictionary<string,dynamic>> eventls = JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(events);
@Heinzi / @mounica 这是array
...
重新投票:欺骗链接不适用于array
【参考方案1】:
您可以创建一个 POCO,它具有所有可能的属性(如果它们是有限的)。像下面这样:
public class Result
public string name get; set;
public string property get; set;
public string status get; set;
public string count get; set;
然后您可以使用:var prova = JsonConvert.DeserializeObject<IEnumerable<Result>>(Result);
。我将反序列化更改为使用 IEnumerable,因为我看到您的 JSON 是一个数组。
然后您可以在访问它们之前检查这些值是否为空。因为每个 Result 对象将只有 JSON 中可用的非 null 属性。
或者,您可以使用 Dictionary
var prova = JsonSerializer.Deserialize<IEnumerable<Dictionary<string, string>>>(result) as List<Dictionary<string, string>>;
然后您可以访问列表中的每个对象并访问您想要的属性或 TryGetValue 方法以更安全。
Console.WriteLine(prova[0]["name"]);
【讨论】:
【参考方案2】:假设:
您从 api 获得 array
的对象(不返回 null
数据 - 回复:可能是结构是“动态”的原因)。
这是一种方法:
//System.Text.Json
var foo = JsonSerializer.Deserialize<JsonElement>(array_from_api);
//It's an array (assumption) of one or more objects
foreach (JsonElement element in foo.EnumerateArray())
//iterate through each object's properties
foreach (JsonProperty o in element.EnumerateObject())
//Assumption: value isn't a nested object/array, otherwise adjust...
Console.WriteLine($"o.Name = o.Value");
//Json.Net
//It's an array (assumption) of one or more objects
JArray deserialized = JsonConvert.DeserializeObject<JArray>(array_from_api);
foreach (JObject jo in deserialized)
//iterate through each JObject's properties
foreach (JProperty p in jo.Properties())
Console.WriteLine($"p.Name = p.Value");
注意:如果结构更复杂 - 更多嵌套,则必须进行一些检查并相应调整(re:嵌套数组、对象等)
【讨论】:
以上是关于反序列化通用 JSON 并使用其属性的主要内容,如果未能解决你的问题,请参考以下文章
除非setter是通用的,否则反序列化时JsonConvert不会初始化属性