JSON中出现解析错误的原因之一:不可打印字符

四月 9th, 2015 2,670 留下评论 阅读评论

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举例:

ASCII码转json测试

ASCII码转json测试

所以可能要手动去删除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
Categories: Javascript, ruby on rails 标签:
  1. 还没有评论呢。
icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif