ruby 1.9.3为什么JSON.generate(h)抛出UndefinedConversionError错误但是h.to_json没有

时间:2015-01-15 20:00:32

标签: ruby json

对于一组特定数据,我们将哈希转换为JSON的通常代码是抛出错误:

the_json = JSON.generate(h)
=> Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8

在尝试查找WHICH字符导致问题时,我们注意到使用to_json不会引发错误

h.to_json
=> (very long string that looks correct)

有没有人对

有任何想法

(a)如何找到有问题的角色,以便我们可以追踪它是如何发生的

(b)为什么JSON.generate比to_json更脆弱?

(c)和MOST重要的是:如何以force_encoding方式调用JSON.generate(就像许多其他ruby方法允许的那样),以便当哈希包含像“Sjöholm”这样的名称时,它会被处理而不会抛出异常。

1 个答案:

答案 0 :(得分:2)

看起来to_json方法不进行UTF-8验证,而JSON.generate则执行:

"\xC3" =~ /./         # => ArgumentError: invalid byte sequence in UTF-8
JSON.generate("\xC3") # => ArgumentError: invalid byte sequence in UTF-8
"\xC3".to_json        # => "\"\xC3\"" XXX: not valid UTF-8

根据我的经验,尝试正则表达式匹配字符串是确保正确的UTF-8编码的简单而可靠的方法(因此是上述示例的第一行)。