反序列化通用 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 或 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 并使用其属性的主要内容,如果未能解决你的问题,请参考以下文章

反序列化json树结构并设置父项

json 从遗留属性名称反序列化

除非setter是通用的,否则反序列化时JsonConvert不会初始化属性

Newtonsoft.Json 序列化和反序列化 以及时间格式 2

如何反序列化 Json 并绑定到变量/属性 c#

基于Json序列化和反序列化通用的封装