【问题标题】:Under what circumstances will JsonConvert.DeserializeObject return null什么情况下JsonConvert.DeserializeObject会返回null
【发布时间】:2021-08-28 06:05:40
【问题描述】:

Newtonsoft.Json(Json.NET)中JsonConvert.DeserializeObject()方法的签名是:

public static object? DeserializeObject(string value)

源码here.

该方法(及其所有重载)返回一个可为空的对象。我想知道什么情况下会返回null?我一直觉得这个方法要么在反序列化不成功的情况下抛出Newtonsoft.Json.JsonException,要么在反序列化成功的情况下抛出一个正确构造的对象。 official documentation 也无助于解释可空性。

一种可能的情况是异常由自定义处理程序处理。该方法是否还有其他情况可以返回null?

var obj = JsonConvert.DeserializeObject<MyObject>("invalid json", new JsonSerializerSettings
{
    Error = (sender, args) => args.ErrorContext.Handled = true
});
// obj is null here?

【问题讨论】:

  • JsonConvert.DeserializeObject&lt;object&gt;("") 例如。
  • @GuruStron 谢谢,我不知道。似乎将空格反序列化为任何引用类型都会导致它返回 null。不过,如果这些事情可以更清楚地记录在案,那就太好了。
  • 不能只看库的代码吗?它是开源的
  • 我跳过了一些源代码,看起来抽象的JsonConverter 类定义了方法ReadJson 有一个返回类型op object?,它基本上是从那里开始的。不是一个真正的情况,但看起来很有趣。
  • .DeserializeObject&lt;..&gt;("").DeserializeObject&lt;..&gt;("null").

标签: c# .net json.net json-deserialization


【解决方案1】:

正如@Lasse V. Karlsen in the comments所说,下面的代码将返回null

JsonConvert.DeserializeObject<SomeClass>("")
// or
JsonConvert.DeserializeObject<SomeClass>("null")

这同样适用于任何属性的值

JsonConvert.DeserializeObject<SomeClass>("{someProp : null}")

请注意,实际的null 字符串会抛出ArgumentNullException

JsonConvert.DeserializeObject<SomeClass>(null)

【讨论】:

  • JsonConvert.DeserializeObject&lt;SomeClass&gt;("{someProp : \"\"}")someProp 设置null 值,它将设置一个空字符串。那是因为c#字符串字面量""表示的是一个完全没有内容的JSON字符串,而"\"\""表示的是一个包含单个JSON值的JSON字符串,即一个空字符串。 (事实上​​,空字符串(而不是包含空 JSON 字符串的字符串)是否是格式良好的 JSON 是有争议的,请参阅Why does JSON.parse fail with the empty string? 进行讨论。)
  • 对,修复了。对于根对象,我认为 Newtonsoft 对空字符串有些宽容,但 "null" 绝对是 null 对象的有效 JSON 表示
猜你喜欢
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多