一个JSON文本必须至less包含两个八位字节
我收到了这个错误,我找不到任何合理的答案,所以我想我会写一个问题的总结。
如果你在irb中运行这个代码片段:
JSON.parse( nil )
你会看到以下错误:
TypeError: can't convert nil into String
我期待函数返回nil
,而不是TypeError
。 如果您使用to_s
转换所有input,那么您将看到八位字节错误:
JSON::ParserError: A JSON text must at least contain two octets!
这很好,很好。 如果你不知道八位字节是什么,阅读这篇文章的总结和解决scheme: 什么是JSON八位字节,为什么需要两个?
解
你传入的variables是一个空string。 不要试图在JSON.parse
方法中使用空string。
题
所以,现在我知道错误的原因,我应该使用什么模式来处理这个问题? 我有点讨厌猴子补丁的JSON库允许nil
值。 任何build议将不胜感激。
parsed = json && json.length >= 2 ? JSON.parse(json) : 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.org
JSONbuild立在两个结构上:
-
名称/值对的集合。 在各种语言中,这被实现为对象,logging,结构,字典,散列表,键控列表或关联数组。
-
有序的值列表。 在大多数语言中,这是作为数组,vector,列表或序列来实现的。
因此,顶层所需的最less两个八比特组(8比特)将是{}
或[]
国际海事组织,最好的解决办法是确保参数JSON.parse
是一个strigified对象或一个strigified数组。 🙂
data.presence && JSON.parse(data) JSON.parse(data.presence || '{}')
hash = JSON.parse(json) rescue {} array = JSON.parse(json) rescue [] string = JSON.parse(json) rescue ''