JSON中出现解析错误的原因之一:不可打印字符
JSON规范规定,字符串需要用Unicode传输,而对于ASCII码中的前32个不可打印字符(第33个字符为空格)应该转化为明文的转义模式,比如换行符0A:”\n”,出现在json中就应该是明文的\n,所以内部表示就应该是”\\n”。
所以假如一个json字符串中出现了01-1F这31个字符(00空字符倒是不会出现错误),json就会解析错误。
Ruby on Rails中的to_json方法,默认并没有将这31个字符给正确转义为json格式,会引起错误。
用Rails的console举例:
所以可能要手动去删除1-31号不可显示的ASCII码,除了\n\r\t之外,一般来说这些字符对于内容显示上不存在作用。
补充一点,ASCII表的最后一个字符127位为DEL (delete),虽然可能也算不可打印字符,不过这个字符不会引起json解析错误。
附上ASCii码表:http://www.asciima.com/
一种解决办法:对to_json解析后的字符串进行字符过滤
def to_json(options = nil) json_str = @data.to_json(options) bytes = [] json_str.each_byte do |c| next if c >= 1 && c <= 31 bytes << c end return bytes.pack('C*') end |