如何区分Json.Net中未提供的空值和值?

使用Json.net反序列化是否有一种方法可以区分空值和未提供的值,即缺少密钥?

我正在考虑使用PATCH请求进行部分对象更新,它们代表不同的意图:

  • Null – >将此属性设置为null
  • 缺少 – >未提供跳过属性

在javascript中,这是undefined和null之间的区别。

我现在提出的最好的方法是使用JObject

我有完全相同的问题,在研究期间我偶然发现了这个问题。

由于普遍的共识不满意,我创建了一个扩展的Nullable结构,我称之为Settable 缺乏想象力。 基本上它是一个可以为空的附加字段IsSet,无论你存储哪个值,只要你存储了一些东西就是真的,只有默认值为假(Settable ),其别名为Settable 。未定义。

只有在找到相应的属性时,反序列化器才会编写Settable ,在这种情况下,IsSet将为true。 如果该属性未包含在反序列化的json中,则将保留默认值,其中IsSet == false。 那么,替换你的int? 具有Settable的DTO类型中的属性将为您提供未定义(或更确切地说,未指定)和null之间所需的差异。

好极了!

我将实现上传到Github上的存储库,供大家使用(不保修,使用风险自负等等……我在医院里有6根肋骨断裂和止痛药:如果有什么不起作用,那就是你的错):

https://github.com/alberto-chiesa/SettableJsonProperties

编辑:至于关于未定义序列化为null的注释,我添加了一个自定义ContractResolver来处理Settable属性并更新了存储库。

这里的答案似乎就是你所追求的: https : //stackoverflow.com/a/21820736/39532

基本摘要是:

  • JSON不直接支持undefined,因为不设置属性在function上是等效的
  • Null可以用new JValue((object)null)表示new JValue((object)null)