首页 > 解决方案 > C#“动态”类型对象总是可以序列化为有效的 JSON 吗?

问题描述

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

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

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

标签: c#jsondynamic

解决方案


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

简短的回答:没有。

更长的答案:您问题的第一部分表明您对dynamicC# 中的含义有一个非常非常错误的想法。 dynamic简单的意思是“将这个程序片段的分析推迟到运行时;分析它,就好像对象的运行时类型是它的编译时类型一样”。

dynamic在 C#中使用 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

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

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


推荐阅读