我在dotnet核心应用程序中收到一个主体,并且其中一个字段可以是随机JSON。为了简单起见,我决定使用动态类型(我将其直接保存在数据库中,而无需弄乱它)。
我需要确保存在该字段,它表示有效的JSON对象。
由于动态对象的工作原理与JSON对象非常相似,因此我可以假定任何C#动态对象都是有效的JSON吗?
答案 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。相反,dynamic
由object
替换为d
类型的编译器,并且d.M()
直到运行时才被分析以确定它是否具有方法{{1} }; M
在编译时无法分析的事实得到了抑制。
简而言之:d.M()
只是dynamic
,上面戴着滑稽的帽子。您不能对object
做出任何假设,除非您也可以对dynamic
做出假设。
答案 1 :(得分:3)
dynamic
不是类型。这只是意味着 actual 类型直到运行时才知道,然后将完成任何绑定(而不是在编译时绑定成员)。
所以不,您不能将所有动态对象序列化为JSON,因为您不能将所有 concrete 对象序列化为JSON。您不能说将流序列化为JSON,因为有太多的瞬时属性无法序列化(如何序列化实际的 data )?