我收到了这个错误,我找不到这个问题的合理答案,所以我想我应该写一个问题的摘要。
如果您在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
值。任何建议都将不胜感激。
发布于 2011-12-06 02:52:16
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)
发布于 2017-02-20 17:52:05
data.presence && JSON.parse(data)
JSON.parse(data.presence || '{}')
发布于 2016-10-29 16:52:25
根据json.org的说法
JSON建立在两种结构之上:
因此,顶层所需的最少两个八位字节(8位)将是{}
或[]
最好的解决方案是确保JSON.parse
的参数要么是一个条形化对象,要么是一个条形化数组。:-)
https://stackoverflow.com/questions/8390256
复制相似问题