c# - C#“动态”类型对象总是可以序列化为有效的 JSON 吗?
问题描述
我在 dotnet 核心应用程序中收到一个正文,其中一个字段可以是随机 JSON。为了简单起见,我决定使用动态类型(我直接将其保存在数据库中,而不必弄乱它)。
我需要确保该字段存在,它代表一个有效的 JSON 对象。
由于动态对象的工作方式与 JSON 对象非常相似,我可以假设任何 C# 动态对象都是有效的 JSON 吗?
解决方案
由于动态对象的工作方式与 JSON 对象非常相似,我可以假设任何 C# 动态对象都是有效的 JSON 吗?
简短的回答:没有。
更长的答案:您问题的第一部分表明您对dynamic
C# 中的含义有一个非常非常错误的想法。 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
替换为 的类型,直到运行时才分析以确定它是否有方法;无法在编译时分析的事实被抑制。object
d
d.M()
M
d.M()
简而言之:dynamic
就是object
戴着一顶滑稽的帽子。你不能对 做任何假设,dynamic
除非你也可以对 做这个假设object
。
推荐阅读
- android - 这张图片中使用了什么 UI 组件?
- hyperledger-fabric - 具有 Composer Multiorg 设置的频道
- apache-kafka - 卡夫卡镜子制造商不工作
- c# - 如何跟踪锁定事件
- python - 主尝试在树莓派中使用 python 通过 modbus 串行控制台读取几个寄存器时出现问题
- assembly - 清除垂直回扫位时,VGA 卡是否会读取像素缓冲区?
- laravel - 在大 bd 上优化 Laravel 中的查询
- groovy - Groovy Closure 中的变量作用域(全局变量和函数参数同名)
- oracle - 使用聚合函数根据 MIN 时间戳过滤记录
- node.js - 节点 JS 函数未执行。可能是什么原因?