我收到了这个错误,我找不到任何合理的答案,所以我想我会写一个问题摘要。
如果您在irb:
中运行此代码段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
值。任何建议都将不胜感激。
答案 0 :(得分:42)
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)
答案 1 :(得分:3)
根据json.org
JSON基于两种结构:
名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,哈希表,键控列表或关联数组。
有序的值列表。在大多数语言中,这被实现为数组,向量,列表或序列。
因此,顶层所需的最少两个八位字节(8位)为{}
或[]
IMO,最好的解决方案是确保JSON.parse
的参数是一个strigified对象或一个strigified数组。 : - )
答案 2 :(得分:3)
data.presence && JSON.parse(data)
JSON.parse(data.presence || '{}')
答案 3 :(得分:0)
hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''