2014-12-28 18 views
2

我只是试图加载UTF-8 json文件并将其返回。它在mac上正常工作,但是当我将它部署到CentOS时,它失败了。JSON.load抛出Encoding :: CompatibilityError

我该如何解决?

加载UTF-8文件。

[[email protected] 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 

红宝石版本是2.0.0。

Rails版本是4.1.4。

+0

也许是因为该文件的字符串被转义了。 –

+0

如何以二进制模式打开JSON文件? –

回答

2

问题是json/pure解析器。匹配字符串的正则表达式使用n选项,表示该模式的编码为ASCII-8BIT。从ruby regex docs

一个正则表达式可以针对一个字符串匹配时,他们要么共享的编码,或正则表达式的编码是US-ASCII和字符串的编码是ASCII兼容。

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

github repository上打开问题。同时尝试一个不同的解析器。我热烈地建议multi_jsonyajloj

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

+0

感谢您的回答!首先,我在github存储库上打开了一个问题。 https://github.com/flori/json/issues/232。现在我正在使用另一个解析器。 –

+0

'失败'是什么意思?如何逃避? – AJcodez

+0

Yajl完全正常。谢谢!! (我的帖子,Yajl没有工作是错误的,请忘记它。) –