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:null
、false
、true
、42
、"Some string"
、
、[]
我认为它是字符串化的。【参考方案4】:
hash = JSON.parse(json) rescue
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''
【讨论】:
这很糟糕,因为它会拯救任何东西,包括您可能想知道的所有其他类型的解析器错误。以上是关于JSON 文本必须至少包含两个八位字节的主要内容,如果未能解决你的问题,请参考以下文章