【问题标题】:Is "[]" valid JSON?“[]”是有效的 JSON 吗?
【发布时间】:2017-05-11 09:38:05
【问题描述】:

我在使用 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; }
}

例外情况

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

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

【问题讨论】:

  • 没有。 [] 是一个有效的 JSON,它是一个空数组。 "[]" 无效(阅读 this)。即使"[]" 可能是一个有效的 JSON,它也会是一个包含“[]”的字符串,而不是一个数组。
  • 有效的 json 更像string json = "[]"; 但是您可以先将 json 反序列化为字符串,然后将结果反序列化为数组。 => var x = JsonConvert.DeserializeObject&lt;User[]&gt;(JsonConvert.DeserializeObject&lt;string&gt;(json));
  • 这是 JavaScript,在 Chrome 中。与 C# 无关。
  • @ChrisS 和 typeof JSON.parse("\"[]\"") 在 Chrome 中返回“字符串”。您的 JSON 可能被浏览器 JSON 解析器认为是有效的,但它是单个字符串,而您尝试将其反序列化为对象数组。
  • 而且 JavaScript 不是 C#。没有必要争论它在 JavaScript 中是有效的。

标签: c# json json.net


【解决方案1】:

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

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

阅读这篇文章,它广泛地描述了这个问题。
What is the minimum valid 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 反序列化到您的 User 数组中:

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

如果此 JSON 是由 3rd 方服务提供的,而您对此无能为力,则需要对其进行整理并使其有效。是的,不幸的是,有时它会发生。
如何?当有对象(用户)时,这取决于您的价值。

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

【讨论】:

    【解决方案2】:

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

    "[]"
    

    是一个字符串,所以反序列化器想把它序列化成一个字符串。

    []
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多