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

Cor*_*ory 63 ruby json ruby-on-rails irb

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

如果您在irb中运行此代码段:

JSON.parse( nil )
Run Code Online (Sandbox Code Playgroud)

您将看到以下错误:

TypeError: can't convert nil into String
Run Code Online (Sandbox Code Playgroud)

我有点期待函数返回nil,而不是TypeError.如果您使用转换所有输入to_s,那么您将看到八位字节错误:

JSON::ParserError: A JSON text must at least contain two octets!
Run Code Online (Sandbox Code Playgroud)

那很好,很好.如果你不知道八位字节是什么,请阅读这篇文章以获得摘要和解决方案: 什么是JSON八位字节,为什么需要两个?

解

您传入的变量是一个空字符串.不要尝试在JSON.parse方法中使用空字符串.

题

所以,现在我知道错误的原因,我应该使用什么模式来处理这个问题?我有点厌恶修补JSON库以允许nil值.任何建议将不胜感激.

Ale*_*yne 43

parsed = json && json.length >= 2 ? JSON.parse(json) : nil
Run Code Online (Sandbox Code Playgroud)

但实际上库应该能够处理这种情况并返回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)
Run Code Online (Sandbox Code Playgroud)