JSON.load抛出Encoding :: CompatibilityError

时间:2014-12-28 04:16:06

标签: ruby-on-rails ruby

我只是尝试加载UTF-8 json文件并将其返回。它在mac上工作正常,但是当我将它部署到CentOS时它会失败。

我该如何解决?

加载UTF-8文件。

[ec2-user@ip-XXX-XXX-XXX-XXX vfs]$ file data/E03124/data.json 
data/E03124/data.json: UTF-8 Unicode text, with very long lines, with no line terminators

错误消息

Caught Encoding::CompatibilityError at '"{\"資産の部\":{': incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)

回溯

json (1.8.1) lib/json/pure/parser.rb:242:in `rescue in parse_string'
json (1.8.1) lib/json/pure/parser.rb:213:in `parse_string'
json (1.8.1) lib/json/pure/parser.rb:257:in `parse_value'
json (1.8.1) lib/json/pure/parser.rb:121:in `parse'
json (1.8.1) lib/json/common.rb:155:in `parse'
json (1.8.1) lib/json/common.rb:334:in `load'
app/controllers/statements_controller.rb:13:in `block in getData'
app/controllers/statements_controller.rb:12:in `open'
app/controllers/statements_controller.rb:12:in `getData'

Rails代码

def getData
  json_data = open("data/#{params[:code]}/data.json") do |io|
    JSON.load(io)
  end
  render :json => json_data
end

Ruby版本是2.0.0。

Rails版本是4.1.4。

1 个答案:

答案 0 :(得分:2)

问题是json/pure解析器。匹配字符串的正则表达式使用n选项,意味着模式采用ASCII-8BIT编码。来自ruby regex docs

  

当regexp共享编码时,可以匹配字符串,或者regexp的编码是US-ASCII,字符串的编码是ASCII兼容的。

     

如果尝试在不兼容的编码之间匹配,则会引发Encoding :: CompatibilityError异常。

github repository上打开一个问题。在此期间尝试不同的解析器。我热烈建议使用yajloj multi_json

如果你无法在你的盒子上构建ruby C扩展,那么这是一个不同的问题。当扩展不能正确构建(afaik)时,JSON gem使用纯变体。