使用Json.net反序列化是否有一种方法可以区分空值和未提供的值,即缺少密钥?
我正在考虑使用PATCH请求进行部分对象更新,它们代表不同的意图:
在javascript中,这是undefined和null之间的区别。
我现在提出的最好的方法是使用JObject
。
答案 0 :(得分:9)
我有同样的问题,在研究过程中我偶然发现了这个问题。
不满意普遍的共识,我创建了一个扩展的Nullable结构,我称之为Settable< T>缺乏想象力。基本上它是一个可以为空的附加字段IsSet,无论你存储哪个值,只要你存储了一些东西就是真的,而且只有默认值(Settable< T>),它是别名为Settable< T>。未定义。
反序列化器将编写Settable< T>。只有当他找到相应的属性时,IsSet才会成立。如果该属性未包含在反序列化的json中,则将保留默认值,其中IsSet == false。那么,替换你的int?具有Settable的DTO类型中的属性将为您提供未定义(或更准确地说,未指定)和null之间所需的差异。
耶!
我将实施内容上传到Github上的存储库,供大家使用(不保修,使用风险自负等等......我在医院里有6个肋骨骨折和止痛药:如果有什么事情没有#&# 39;做你的错!)
https://github.com/alberto-chiesa/SettableJsonProperties
编辑: 至于关于未定义序列化为null的注释,我添加了一个自定义ContractResolver来处理Settable属性并更新了存储库。
答案 1 :(得分:0)
这里的答案似乎就是你所追求的:https://stackoverflow.com/a/21820736/39532
基本摘要是:
new JValue((object)null)