如何反序列化/序列化“混合”数据结构(在 C# 中)

Posted

技术标签:

【中文标题】如何反序列化/序列化“混合”数据结构(在 C# 中)【英文标题】:How to deserialilze/serialize "mixed" data structures (in C#) 【发布时间】:2021-09-21 07:50:38 【问题描述】:

令人惊讶的是,很多 API 都具有“混合”数据结构(到目前为止,我还没有找到更好的术语)。

我的意思是 API 会返回一个对象数组,例如:

[
   "x": 10, "y": 20 ,
   "x": 5, "y": 20 ,
  "ZERO",
   "x": 20, "y": 20
]

在某些语言中,混合复杂类型和枚举 (?) 作为预定义值的占位符似乎很常见。至少有一个 rust 开发人员曾经告诉我,他处理这样的事情没有问题。

但是如何在 C# 中处理这个问题,例如Newtonsoft.Json 还是 Json.NET?


更新:修复了 x 和 y 周围缺少的引号

【问题讨论】:

欢迎来到非结构化 JSON 和不一致 Web 请求的狂野西部。原因很简单,javascript 和懒惰/***的 FulLStAcK dEvElOpErS... 无论如何,在某些情况下,您需要为 Text.Json 或类似的东西编写转换器,在其他情况下,您将不得不迭代地解析 Json,具体取决于它是多么成熟 我也遇到了这个问题,我使用了JsonElement,然后创建了一个类似于JsonDeserialize的函数,它自己将JsonElement作为函数的参数。 任何意见如何在讨论中的结构名称?所以:术语或措辞...... 从 json 标准的角度来看,它是完全有效的 json。对吗? 似乎没有内置的方法来处理联合类型。例如 omnisharp 使用自定义转换器处理 such types 【参考方案1】:

你必须像这样手动解析它

static void Main(string[] args)

    var str = "[  x: 10, y: 20 ,  x: 5, y: 20 ,'ZERO', x: 20, y: 20]";

    var dynObjects = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic[]>(str);

    List<C> concretes = new List<C>();
    foreach(var d in dynObjects)
    
        if(d is string)
        
            concretes.Add(new C()  Zero = d );
        
        else
        
            concretes.Add(new C()  X = d.x, Y = d.y );
        
    



class C 

    public int X  get; set; 

    public int Y  get; set; 

    public string Zero  get; set; 

【讨论】:

以上是关于如何反序列化/序列化“混合”数据结构(在 C# 中)的主要内容,如果未能解决你的问题,请参考以下文章

guid的值为null如何在C#反序列化

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

如何在C#中解析/反序列化从rest服务返回的JSON

C# 如何反序列化简单结构中的 json DATAS 数组?

在C#中,Json的序列化和反序列化的几种方式总结

在C#中,Json的序列化和反序列化的几种方式总结