"[]"有效的 JSON 吗?



我在使用 JSON.NET 反序列化此 JSON 字符串时遇到麻烦(请注意引号):

"[]"

根据您访问的JSON验证网站,这是有效的JSON(例如jsonlint说它是)。

JSON.NET 代码

void Main()
{
string json = ""[]""; 
var x = JsonConvert.DeserializeObject<User[]>(json);
Console.WriteLine(x);
}
// Define other methods and classes here
public class User
{
public string Id { get; set; }
public int Age { get; set; }
}

例外

将值"[]"转换为键入"用户查询+用户[]"时出错。路径 '',第 1 行,位置 4。

有没有办法强制 JSON.NET 解析这个?

第 1 部分:"[]"是有效的 JSON 吗?

有几个关于JSON的文档和标准,以及数百个解析器;其中一些假设JSON只能是对象{}或数组[],但有些允许将字符串,数字等单个值用作JSON。

阅读本文,它广泛描述了这个问题。
最小有效 JSON 是多少?

关于JSON有效性的争议是另一个问题。在您的情况下,没关系,因为...

第 2 部分:为什么您的代码不起作用。

即使我们允许非对象\非数组是有效的 JSON,您的 JSON 也表示等于"[]"的单个字符串。它可以是其他任何东西,不是括号,它不是数组符号,而只是两个符号"["和"]"。

但是,您尝试将此 JSON 解析为对象数组,这无论如何都会导致错误。

换句话说,即使它是一个有效的JSON,那么它是一个有效的JSON字符串,而不是JSON数组。

var str1 = JSON.parse(""[]""),
str2 = JSON.parse(""could be anything else, not brackets""),
arr = JSON.parse("[]");

console.log(typeof str1);
console.log(typeof str2);
console.log(typeof arr);
var str1_s = JSON.stringify([]);
console.log("Valid JSON of an empty array: " + str1_s);
var arr_s = JSON.stringify("[]");
console.log("Partly valid JSON of a string '[]': " + arr_s);

第3部分:你应该怎么做

最好的主意 - 停止使用无效的 JSON 作为输入。告诉给你这个JSON的人,它是无效的JSON数组,你不能使用它。如果 JSON 是正确的,您就可以将 JSON 反序列化为User数组,就像使用它一样:

string json = "[]"; 
var x = JsonConvert.DeserializeObject<User[]>(json);
Console.WriteLine(x);

如果此 JSON 是从第三方服务提供的,而您对此无能为力,那么您需要对其进行整理并使其有效。是的,不幸的是,有时会发生这种情况。
如何?这取决于当有对象(用户)时你的值是什么。

它可能是像这样的 JSON 序列化 JSON 字符串(双序列化),然后您需要反序列化一个字符串,然后反序列化数组。
或者它可以在开头和结尾有两个奇数引号,您可以删除它们。

它是有效的 JSON,但反序列化程序失败,因为数据类型不匹配。

"[]"

是一个字符串,因此反序列化程序希望将其序列化为字符串。

[]

是一个空数组。所以,简而言之,这应该有效:

string json = "[]"; 
var x = JsonConvert.DeserializeObject<User[]>(json);
Console.WriteLine(x);

相关内容

  • 没有找到相关文章

最新更新