JsonConvert.DeserializeObject<T>在哪些情况下会返回null?

6
我正在使用.NET core 3.1,C#8和启用可空引用类型。
从我编写的类库中,我正在引用版本为12.0.3NewtonsoftJson package
我注意到通过调用JsonConvert.DeserializeObject<T>,我可以获得一个空引用(Visual Studio分析器检测到可能的空引用解引用)。
请注意,我正在调用采用字符串和JsonSerializerSettings实例的重载。 我仅使用JsonSerializerSettings来处理可能的反序列化错误(通过Error property)。

GitHub源代码确认,通过MaybeNull属性,我调用的重载可能返回一个空引用:请查看这里进行确认。

我的问题是:在哪些情况下,newtonsoft JSON将JSON字符串反序列化为.NET类型时返回null引用?

通常情况下,它返回给定类型的对象填充或具有其属性的默认值,我从未遇到过返回null的情况。

1个回答

8

由于JSON字面量中的null是有效的JSON,因此您可以按以下方式重现它:

var o = JsonConvert.DeserializeObject<object>("null");
Console.WriteLine(o == null); // True

很好的发现。有趣的是,如果我尝试在VS 2019中编译您的示例,我不会收到任何分析器警告。只有当我添加第二个参数到调用中(new JsonSerializerSettings()),以便调用其他重载时,警告才会出现。 - Enrico Massone
所以我们面临着一个奇怪的情况。您重现了一个情况,在该情况下未标记为可能返回 null 的重载会返回 null。实际上获取空引用警告的唯一方法是调用另一个重载(请求 JsonSerializerSettings instnace 的那个)。 - Enrico Massone
1
所以,你发现的情况肯定是一种从反序列化中返回null的方式。我怀疑库的类型注释不完整,或者除了你发现的那种情况之外,还有其他微妙的情况导致了null的返回行为。 - Enrico Massone
1
@Enrico 我认为这只是注释中的疏忽,JsonConvert.DeserializeObject("null", new JsonSerializerSettings()) 的行为是相同的。 :) - CodeCaster
1
已得到Newtonsoft JSON维护者的确认。请查看我提交的此问题:https://github.com/JamesNK/Newtonsoft.Json/issues/2366 - Enrico Massone
除了“null”输入之外,还有另一种可能性会返回null:编写一个自定义的JSON转换器,根据某个自定义逻辑返回null。因此,类型注释可能考虑了这两种情况。他们还确认,具有单个参数的重载未进行注释,但实际上应该以相同的方式进行注释。 - Enrico Massone

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