【问题标题】:How to distinguish between null value and value not provided in Json.Net? [duplicate]如何区分空值和 Json.Net 中未提供的值? [复制]
【发布时间】:2014-04-05 07:21:03
【问题描述】:

使用 Json.net 反序列化有没有办法区分空值和未提供的值,即缺少键?

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

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

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

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

【问题讨论】:

  • 所以一个较新的问题是重复的? Stackoverflow 的好方法。
  • 不是重复的。这个关于反序列化g,关于序列化的另一个问题

标签: c# rest json.net


【解决方案1】:

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

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

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

耶!

我将实现上传到 Github 上的存储库中,供所有人使用(无保修,使用风险自负等......我在医院里有 6 根肋骨骨折并服用止痛药:如果某些东西不起作用这是你的错):

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

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

【讨论】:

  • 这种方法的一个更常见的变体是将其命名为Optional,删除where T : struct 约束并删除对T? 的引用以允许甚至Optional<string> 等。如果用户想要 undefined/null/value 类型,让用户将其实例化为 Optional<int?>。但是,是的,基本的想法是好的。
  • 可选?这可能是一个好名字。我正在考虑放弃结构限制,但我是在替换 Nullable 类型之后,所以我尽可能地接近那个实现。谢谢!
  • 这适用于反序列化,但不适用于序列化。 Settable.Undefined 的序列化返回“null”。例如:如果我有一个 Tmp 类,就像你在测试中所做的那样,我反序列化“{A:10}”然后序列化结果,结果将是“{A:10,B:null}”。当 Settable.IsSet 为 false 时,关于如何从序列化类中发出属性的任何想法?
  • 嗨,汤姆。是的,我不担心序列化,因为在我的使用中,我总是有一个 .Net 后端和一个 JavaScript 客户端,所以我从数据库中读取数据并且“未定义”不会发生。空,是的,但未定义,不。你需要一个自定义的 ContractResolver 来做你想做的事。我创建了一个 Github 存储库,其中包含来自此答案的文件和您正在寻找的 ContractResolver。干杯!
  • @A.Chiesa 我猜你没有用 Settable 测试这个案例。我试了一下,得到了异常“完成反序列化对象后在 JSON 字符串中找到的附加文本”。你有解决方案吗?
【解决方案2】:

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

基本总结是:

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

【讨论】:

  • 这是一个相反的问题。我收不发。虽然它证实了我的想法。
  • @Kugel 是的,我知道该链接中的问题与您所追求的有点不同......但我认为接受的答案确实更好地解释了 null 和 undefined 之间的区别JSon.Net 有望为您指明正确的方向。
猜你喜欢
  • 2016-11-20
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2023-03-30
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多