【发布时间】:2018-03-01 17:23:42
【问题描述】:
我们已将 Newtonsoft.Json 从 10.0.3 升级到 11.0.1,之前运行的代码不再运行。
我们有以下 JSON:
[{"mail-type":"registration","response":"250 OK id=1UjnNr-gdf-C0 ","invoice-id":,"email":"testuser08@test.com"}]
我们调用以下方法:
var events = JsonConvert.DeserializeObject<Event[]>(jsonEvents);
这在 10.0.3 上运行良好,但在 11.0.1 上却不行。在这个版本中会抛出以下异常:
抛出异常:'Newtonsoft.Json.JsonReaderException' in Newtonsoft.Json.dll
附加信息:未定义的令牌不是有效的 System.Nullable`1[System.Int64]。路径“[0].invoice-id”,第 1 行。
我尝试将以下选项传递给DeserializeObject
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
但仍然是同样的错误。必须进行哪些更改才能使其在 11.0.1 上运行。我担心我们无法容纳 JSON 输出,因为它来自第三方 API。
【问题讨论】:
-
不确定具体发生了什么变化或原因,但您的 JSON 格式不正确。上传到jsonlint.com,你会看到如下错误:
Error: Parse error on line 4: ...0 ", "invoice-id": ,Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got ','。 IE。"invoice-id": ,属性不是格式良好的 JSON 属性。 -
@dbc 谢谢,我知道这一点。不幸的是,我无法创建这个 JSON,我需要解析它。不管怎样,以前的版本都可以反序列化,所以新版本也必须有一些东西来完成它。
-
我认为它是:以前的版本有一个错误,允许解析格式错误的 json,就像你的一样。在较新的版本中,此错误已修复。所以我不明白为什么“在新版本中也必须有一些东西来完成它”。
-
@Evk 我想是的。但正如我所说,这个无效的 JSON 不是在我们的应用程序中创建的,但我们需要处理它。所以找到一种方法来处理它会很棒(例如编写自定义解析器或在选项中设置一些属性以忽略此类无效数据)
-
看起来更改记录在 release notes 中:修复 - 修复了读取 undefined for nullable long 时不会出错的问题。我刚刚测试了 Json.NET 10.0,似乎使用
int?作为发票 ID 会导致异常,但使用long?作为发票 ID 会导致空值。在 11.0 中,int?和long?都抛出异常。