如何反序列化/序列化“混合”数据结构(在 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# 中)的主要内容,如果未能解决你的问题,请参考以下文章
如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML