我很震惊——但也许是因为我不知情——JsonConvert.Deserialize<>()
会毫无怨言地解析这个格式错误的JSON:
{"Items": ["hello" "goodbye",]}
它似乎使用了一些启发式方法来实现这一点,在这种情况下,我认为它做了"正确的事情"。但事实上,它默默地这样做是非常令人担忧的,因为我不知道我的行为可以信任什么。
JSON的旧版本。NET(6.x)抛出错误,但较新版本(9.x)不会。此外,仅仅使用非通用版本的Deserialize()就会抱怨语法错误——只是通用版本没有。
我试图在dotnetfiddle上发布一个repro,但没有成功,因为dotnetfiidle总是加载JSON的6.x版本。NET,即使您要求不同的版本。(请参见https://dotnetfiddle.uservoice.com/forums/228764--net-fiddle-ideas/suggestions/10782315-load-the-specified-version-of-json-net-rather-than)。
因此,这里有一个完整的repro(包括打印出正在使用的Netwonsoft.Json.Dll版本的代码)。它在9x版本的JSON下打印2(因为它"成功"解析了JSON)。NET。在6.x的情况下,它会抛出一个错误(我认为应该是这样)。
using System;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
Console.WriteLine(typeof(JsonConvert).Assembly.GlobalAssemblyCache);
Console.WriteLine(typeof(JsonConvert).Assembly.FullName);
// I think this JSON is invalid because (1) it is missing a comma between the two values and (2) there is an extra comma at the end
string json = @"{""Items"": [""hello"" ""goodbye"",]}";
// This deserialize is successful and produces an object with two values for Items
Container result = JsonConvert.DeserializeObject<Container>(json);
Console.WriteLine(result.Items.Length + " items");
}
}
public class Container
{
public string[] Items { get; set; }
}
这种行为是否有文件记录和/或常见做法?
在这种情况下,有没有办法强制出错?
我问过这个问题JSON中。NET GitHub项目。事实证明,这是经过设计的。詹姆斯·纽顿·金的回应是:
JsonTextReader接受尾随逗号。没有可更改的设置,但您可以扮演您自己更严格的JsonReader实现。