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

时间:2011-12-05 18:47:27

标签: ruby-on-rails ruby json irb

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

如果您在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值。任何建议都将不胜感激。

4 个答案:

答案 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基于两种结构:

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

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

  3. 因此,顶层所需的最少两个八位字节(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 ''
相关问题