"[]"是有效的JSON吗?

Chr*_*s S 3 c# json json.net

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

"[]"
Run Code Online (Sandbox Code Playgroud)

根据您访问的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; }
}
Run Code Online (Sandbox Code Playgroud)

例外

将值"[]"转换为"UserQuery + User []"类型时出错.路径'',第1行,第4位.

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

Yel*_*yev 8

第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);
Run Code Online (Sandbox Code Playgroud)

第3部分:你应该怎么做

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

    string json = "[]"; 
    var x = JsonConvert.DeserializeObject<User[]>(json);
    Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)

如果这个JSON是由第三方服务提供的,而你无法做到这一点,那么你需要整理它并使其有效.是的,不幸的是,有时它会发生.
怎么样?它取决于ARE对象(用户)时的值.

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


Mar*_*rkO 5

它是有效的JSON,但由于数据类型不匹配,反序列化器会失败.

"[]"
Run Code Online (Sandbox Code Playgroud)

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

[]
Run Code Online (Sandbox Code Playgroud)

是一个空数组.所以,总之,这应该工作:

string json = "[]"; 
var x = JsonConvert.DeserializeObject<User[]>(json);
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)