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

Kug*_*gel 7 c# rest json.net

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

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

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

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

我现在想出的最好的就是使用JObject.

A. *_*esa 9

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

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

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

好极了!

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

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

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