如何将内容不同但结构相同的 JSON 字符串转换为 C# 对象?
Posted
技术标签:
【中文标题】如何将内容不同但结构相同的 JSON 字符串转换为 C# 对象?【英文标题】:How to convert JSON strings with different content but in same structure to C# objects? 【发布时间】:2020-12-03 14:21:05 【问题描述】:我有一个 Xamarin Forms 项目。在这个项目的一部分中,我需要以 JSON 字符串的形式从数据库中检索数据,但是这些数据可能会在根、值和根名称的数量上发生变化。然而,所有检索到的字符串都具有相同的结构,字符串中的所有信息都是不同的。
一个示例字符串:(原来是一行。)
"20Pr":
"20Pr":
"AA": "0:0:0",
"EE": "1:0:4",
"Comp": 0,
"ASE": "0:0:0",
"PES": "1:0:0",
"PLD": "0:0:4",
"ASET": "0:0:0"
,
"22Bp Cache":
"AA": "0:0:0",
"EE": "1:0:1",
"Comp": 0,
"ASE": "-",
"PES": "1:0:0",
"PLD": "0:0:1",
"ASET": "-"
,
"21SSL Fail":
"AA": "0:0:0",
"EE": "1:0:1",
"Comp": 0,
"ASE": "-",
"PES": "1:0:0",
"PLD": "0:0:1",
"ASET": "-"
,
"40godown":
"43Sw & DB":
"AA": "0:0:0",
"EE": "1:24",
"Comp": 0,
"ASE": "-",
"PES": "1:1:4",
"PLD": "0:0:1:0",
"ASET": "-"
,
"40goown":
"AA": "0:0:0",
"EE": "1:24",
"Comp": 0,
"ASE": "0:0:0",
"PES": "1:0:4",
"PLD": "0:2:0",
"ASET": "0:0:0"
只有 AA,EE,Comp,ASE,PES,PLD,ASET 是恒定的,但它们的值不是恒定的。
是否可以通过更改 JSON 字符串来创建 C# 对象,而无需将名称信息设为“40godown”?
【问题讨论】:
这真的取决于您希望它如何工作,但是使用 JSON.NET 的自定义反序列化器可以工作。每个子对象子对象都被反序列化为相同的对象类型,因为结构不会改变,但是您可以创建字典/您需要包含对象集的任何其他数据结构。我们总是在谈论一个父母然后是多个孩子,还是可能有额外的嵌套级别等? 是的,它总是有一个父母和多个孩子,然后有 6 或 7 个这样的父母。为了说明,在有问题的示例字符串中,“20Pr”和“40godown”是父母,每个人都有 3 个孩子。 @Charleh 【参考方案1】:假设您定义了一个具有 AA
、EE
、...、ASET
属性的类 Thing
,您可以将该 JSON 反序列化为 Dictionary<string, Dictionary<string, Thing>>
,而不会丢失信息。
var data = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Thing>>>(json);
【讨论】:
你知道我最近在 .net 中看到有人手动解析 JSON ......我告诉他们反序列化,他们告诉我他们没有时间学习任何新东西。 @Charleh Newtonsoft.Json 10 岁。显然这不是什么新鲜事。我编程了 40 年,几乎每天我都学到了一些新东西,而且我还在学习。我不理解拒绝学习新事物的程序员。以上是关于如何将内容不同但结构相同的 JSON 字符串转换为 C# 对象?的主要内容,如果未能解决你的问题,请参考以下文章