可以将C#“动态”类型对象始终序列化为有效的JSON吗?

时间:2019-12-10 22:04:21

标签: c# json dynamic

我在dotnet核心应用程序中收到一个主体,并且其中一个字段可以是随机JSON。为了简单起见,我决定使用动态类型(我将其直接保存在数据库中,而无需弄乱它)。

我需要确保存在该字段,它表示有效的JSON对象。

由于动态对象的工作原理与JSON对象非常相似,因此我可以假定任何C#动态对象都是有效的JSON吗?

2 个答案:

答案 0 :(得分:6)

  

由于动态对象的工作原理与JSON对象非常相似,因此我可以假定任何C#动态对象都是有效的JSON吗?

简短回答:否。

更长的答案:问题的第一部分表明您对dynamic在C#中的含义有非常非常错误的认识。 dynamic的简单含义是“将对程序片段的分析推迟到运行时;就象对对象的运行时类型为其编译时类型那样进行分析”。

您甚至不需要像JSON对象之类的任何东西就可以在C#中使用dynamic

class Foo { public void M() { }}
class Bar { public void M() { }}
...
object o = X() ? (object) new Foo() : (object) new Bar();
o.M(); // Illegal.
dynamic d = o;
d.M(); // Legal; calls either Foo.M or Bar.M

不涉及JSON。相反,dynamicobject替换为d类型的编译器,并且d.M()直到运行时才被分析以确定它是否具有方法{{1} }; M在编译时无法分析的事实得到了抑制。

简而言之:d.M()只是dynamic,上面戴着滑稽的帽子。您不能对object做出任何假设,除非您也可以对dynamic做出假设。

答案 1 :(得分:3)

dynamic不是类型。这只是意味着 actual 类型直到运行时才知道,然后将完成任何绑定(而不是在编译时绑定成员)。

所以不,您不能将所有动态对象序列化为JSON,因为您不能将所有 concrete 对象序列化为JSON。您不能说将流序列化为JSON,因为有太多的瞬时属性无法序列化(如何序列化实际的 data )?