JSON 文本必须至少包含两个八位字节

Posted

技术标签:

【中文标题】JSON 文本必须至少包含两个八位字节【英文标题】:A JSON text must at least contain two octets 【发布时间】:2012-01-13 11:38:33 【问题描述】:

我收到了这个错误,我找不到任何合理的答案来回答这个问题,所以我想我会写一个问题的摘要。

如果你在 irb 中运行这个 sn-p:

JSON.parse( nil )

您将看到以下错误:

TypeError: can't convert nil into String

我有点期待函数返回nil,而不是TypeError。如果您使用to_s 转换所有输入,那么您将看到八位字节错误:

JSON::ParserError: A JSON text must at least contain two octets!

这很好。如果您不知道八位字节是什么,请阅读这篇文章以获取摘要和解决方案: What is a JSON octet and why are two required?

解决方案

您传入的变量是一个空字符串。不要尝试在 JSON.parse 方法中使用空字符串。

问题

那么,现在我知道了错误的原因,我应该使用什么模式来处理这个问题?我有点讨厌猴子修补 JSON 库以允许 nil 值。任何建议将不胜感激。

【问题讨论】:

可能是因为绝对 MINIMUM 有效的 javascript 字符串是 "",它是两个八位字节(绝对最小的最小对象是 )。可能是编写编码器/解析器的人不认为null 也是有效的javascript 值。 【参考方案1】:
parsed = json && json.length >= 2 ? JSON.parse(json) : nil

但实际上库应该能够处理这种情况并返回 nil。具有内置 JSON 支持的 Web 浏览器似乎完全可以按照您的预期工作。


或者用一个稍微有点侵入性的迷你补丁来做到这一点:

module JSON
  def self.parse_nil(json)
    JSON.parse(json) if json && json.length >= 2
  end
end

parsed = JSON.parse_nil(json)

【讨论】:

是的,尽管我需要在我尝试解析的所有地方重复这一点。也许我应该提交一个补丁。 为您可以使用的 JSON 模块添加了一个小补丁。它不涉及疯狂的方法别名魔法或任何东西,并且很容易重复使用。 @Alex 您会在哪里部署迷你补丁以在整个应用程序中捕获此问题? @AlexWayne 为什么不是 JSON.parse(json) if json.is_a?(String) && json.length >= 2 最好先在 parse_nil 中接受 json = json.to_s.strip【参考方案2】:
data.presence && JSON.parse(data)

JSON.parse(data.presence || '')

【讨论】:

原谅我的无知(可怜的 windows 家伙)。我是否需要将 'data.presence &&' 和 'JSON.parse' 行添加到我的 podfile 中?试过了,但我得到了一个错误(正如你可能期望的那样......)【参考方案3】:

根据json.org

JSON 建立在两种结构之上:

    名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。

    有序的值列表。在大多数语言中,这被实现为数组、向量、列表或序列。

因此,顶层至少需要两个八位字节(8 位)是 []

IMO,最好的解决方案是确保 JSON.parse 的参数是一个带标记的对象或一个带标记的数组。 :-)

【讨论】:

这不再是真的。 2014 年 3 月的 RFC 7159 更新了这些限制。以下所有内容均为有效 JSON:nullfalsetrue42"Some string"[] 我认为它是字符串化的。【参考方案4】:
hash = JSON.parse(json) rescue 
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''

【讨论】:

这很糟糕,因为它会拯救任何东西,包括您可能想知道的所有其他类型的解析器错误。

以上是关于JSON 文本必须至少包含两个八位字节的主要内容,如果未能解决你的问题,请参考以下文章

C# 比较两个包含小写文本的 byte[] 数组

字节流和字符流

BZOJ 1030 JSOI2007 文本生成器

bzoj1030[JSOI2007]文本生成器

bzoj1030[JSOI2007]文本生成器

P4052 [JSOI2007]文本生成器