JsonConvert.DeserializeObject会在什么情况下返回null?

4

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

public static object? DeserializeObject(string value)

这里有源代码。

该方法(及其所有重载)返回可空对象。我想知道在什么情况下会返回null?我一直以为,这个方法要么在反序列化失败时抛出Newtonsoft.Json.JsonException,要么在反序列化成功时构造一个正确的对象。然而官方文档并不解释这个可能性。

一个可能的情况是异常被自定义处理器处理了。还有其他情况会导致该方法返回null吗?

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

例如:JsonConvert.DeserializeObject<object>("") - Guru Stron
@GuruStron 谢谢,我不知道这个。看起来将空格反序列化为任何引用类型都会导致它返回 null。如果这些事情能够更清晰地记录下来就好了。 - scharnyw
2
当然可以。但这是一个API合同问题。如果每个人都被告知“只需阅读库的代码”,那么空值注释的意义何在?通过阅读代码,我不断担心我依赖的实现细节可能会在未来的版本中发生变化。 - scharnyw
1
@JochemVanHespen 看起来这个 API 复杂得足以让我每次使用它时都要检查空值… - scharnyw
3
.DeserializeObject<..>("") 或者 .DeserializeObject<..>("null") - Lasse V. Karlsen
显示剩余8条评论
1个回答

4

正如@Lasse V. Karlsen在评论中提到的那样,下面的代码将返回null

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

任何属性的值都适用于此。
JsonConvert.DeserializeObject<SomeClass>("{someProp : null}")

请注意,实际的null字符串会抛出ArgumentNullException异常。
JsonConvert.DeserializeObject<SomeClass>(null)

JsonConvert.DeserializeObject<SomeClass>("{someProp : \"\"}") 不会将 someProp 设置为 null 值,而是将其设置为空字符串。这是因为 C# 字符串字面量 "" 表示一个没有任何内容的 JSON 字符串,但 "\"\"" 表示包含单个 JSON 值(即空字符串)的 JSON 字符串。实际上,是否使用空字符串(而不是包含空 JSON 字符串的字符串)构成了良好的 JSON 是有争议的,请参见 Why does JSON.parse fail with the empty string? 进行讨论。 - dbc
好的,已经修复了。对于根对象,我认为 Newtonsoft 对空字符串有些宽容,但是 "null" 绝对是表示 null 对象的有效 JSON 表示形式。 - Charlieface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接