Can C#quot;“动态”;类型对象是否始终序列化为有效的JSON?

Can C#quot;“动态”;类型对象是否始终序列化为有效的JSON?,c#,json,dynamic,C#,Json,Dynamic,我在dotnet核心应用程序中收到一个body,其中一个字段可以是随机JSON。为了简单起见,我决定使用动态类型(我直接将其保存在DB中,而不必处理它) 我需要确保该字段存在,它表示一个有效的JSON对象 由于动态对象的工作原理与JSON对象非常相似,我可以假设任何C动态对象都是有效的JSON吗?动态不是一种类型。这只意味着实际类型在运行时之前是未知的,任何绑定都将在运行时完成(而不是在编译时绑定成员) 因此,不能将所有动态对象序列化为JSON,因为不能将所有具体对象序列化为JSON。例如,您不

我在dotnet核心应用程序中收到一个body,其中一个字段可以是随机JSON。为了简单起见,我决定使用动态类型(我直接将其保存在DB中,而不必处理它)

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


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

动态
不是一种类型。这只意味着实际类型在运行时之前是未知的,任何绑定都将在运行时完成(而不是在编译时绑定成员)


因此,不能将所有动态对象序列化为JSON,因为不能将所有具体对象序列化为JSON。例如,您不能将流序列化为JSON,因为有太多无法序列化的临时属性(如何序列化实际数据)

动态
不是一种类型。这只意味着实际类型在运行时之前是未知的,任何绑定都将在运行时完成(而不是在编译时绑定成员)

因此,不能将所有动态对象序列化为JSON,因为不能将所有具体对象序列化为JSON。例如,您不能将流序列化为JSON,因为有太多无法序列化的临时属性(如何序列化实际数据)

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

简短回答:没有

较长的回答:你问题的第一部分表明你对C#中的
dynamic
的含义有非常非常错误的理解
dynamic
的简单意思是“将此程序片段的分析推迟到运行时;将其分析为对象的运行时类型是其编译时类型”

在C#中使用
dynamic
,您甚至不需要任何类似于JSON对象的东西:

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

简而言之:
dynamic
就是一个戴着滑稽帽子的
对象。您不能对
动态
进行任何假设,除非您也可以对
对象
进行任何假设

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

简短回答:没有

较长的回答:你问题的第一部分表明你对C#中的
dynamic
的含义有非常非常错误的理解
dynamic
的简单意思是“将此程序片段的分析推迟到运行时;将其分析为对象的运行时类型是其编译时类型”

在C#中使用
dynamic
,您甚至不需要任何类似于JSON对象的东西:

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


简而言之:
dynamic
就是一个戴着滑稽帽子的
对象。你不能对
dynamic
做任何假设,除非你也可以对
object

做任何假设。从技术上讲,任何可以原子化为JSON原语(int、string、object、array、boolean)的数据对象都是JSON可序列化的。只要对象由这些原语组成,并且对象上所有数组/对象的内容都可以由这些原语组成(等等),那么它应该是可序列化的。埃塔:正如扎克提到的,这里没有任何循环引用。是的,除非你有循环引用。但这适用于任何对象结构。不,您可以将任何对象放入声明为动态的变量中。由于有许多对象可以放在该引用中,所以不能假定它是JSON可序列化的。如果您只是声明POCO,那么您可以假设它可以JSON序列化,但您不能保证。更好的检查方法可能是使用字符串而不是动态,并在数据库中使用JSON约束,因为该随机场是分配给动态对象的JSON,它不能作为有效对象的理由或保证。创建一个json对象并从中删除一个括号,您将得到一个无效的json。上面提到的动态和json之间的相似性不能保证数据的有效性。如果对象是字符串而不是动态的,那么可以使用JToken.Parse来验证它。(来自Newtonsoft.Json)@JSteward:有趣的事实是,有些对象不能放入
动态变量中。可空值类型的实例不能放入
动态
。如果你有
int?x=任意();动态d=x
d
要么是
null
要么是装箱的
int
。它从来不是
int?
。从技术上讲,任何可以原子化为JSON原语(int、string、object、array、boolean)的数据对象都是JSON可序列化的。只要对象由这些原语组成,并且对象上所有数组/对象的内容都可以由这些原语组成(等等),那么它应该是可序列化的。埃塔:正如扎克提到的,这里没有任何循环引用。是的,除非你有循环引用。但这适用于任何对象结构。不,您可以将任何对象放入声明为动态的变量中。由于有许多对象可以放在该引用中,所以不能假定它是JSON可序列化的。如果
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