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

时间:2014-03-04 00:22:41

标签: c# rest json.net

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

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

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

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

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

2 个答案:

答案 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

基本摘要是:

  • 未定义JSON没有直接支持,因为没有设置 财产在功能上是等同的
  • Null可以由new JValue((object)null)
  • 表示