如何将内容不同但结构相同的 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】:

假设您定义了一个具有 AAEE、...、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# 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将分层表转换为json

将 bigquery json 字符串转换为列

将 UNIX 时间从 json 导入(swift 结构)转换为日期作为字符串并填充表

这个 JSON 结构何时转换为所有字符串?

如何将 JSON 解码为不同的类型?

如何使用 C#/LINQ 将 XML 转换为 JSON?