我在使用JSON.NET反序列化此JSON字符串时遇到了麻烦(请注意引号):
array_merge
根据您访问的JSON验证网站,这是有效的JSON(例如jsonlint表示它是)。
JSON.NET代码:
"[]"
例外
转换值时出错" []"输入' UserQuery + User []'。路径'',第1行,第4位。
有没有办法强制JSON.NET解析它?
答案 0 :(得分:8)
JSON上有几个文档和标准,还有数百个解析器;其中一些假设JSON只能是对象{}
或数组[]
,但有些允许单个值如字符串,数字用作JSON。
阅读这篇文章,它广泛地描述了这个问题 What is the minimum valid JSON?
关于JSON有效性的争议是另一个问题。在你的情况下,它并不重要,因为......
即使我们允许非对象\非数组是有效的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);

最好的主意 - 停止使用无效的JSON作为输入。告诉谁给你这个JSON,它是无效的JSON数组,你不能使用它。您可以将JSON反序列化为User
数组,如果它正确就像您使用它一样:
string json = "[]";
var x = JsonConvert.DeserializeObject<User[]>(json);
Console.WriteLine(x);
如果此JSON是由第三方服务提供的,而您无法对此做任何事情,那么您需要对其进行整理并使其有效。是的,不幸的是,有时它会发生 怎么样?它取决于ARE对象(用户)时的值。
它可能是这样的JSON序列化JSON字符串(双序列化),然后您需要反序列化字符串,然后反序列化数组。
或者它可以在开头和结尾有两个奇数引号,你可以删除它们。
答案 1 :(得分:5)
它是有效的JSON,但由于数据类型不匹配,反序列化程序会失败。
"[]"
是字符串,因此反序列化器希望将其序列化为字符串。
[]
是一个空数组。所以,简而言之,这应该有效:
string json = "[]";
var x = JsonConvert.DeserializeObject<User[]>(json);
Console.WriteLine(x);