一个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立在两个结构上:

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

  2. 有序的值列表。 在大多数语言中,这是作为数组,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 ''