Crystal语言解析含换行符的JSON抛出异常,如何正确解析?
解决Crystal中JSON解析时的
JSON::ParseException问题 这个错误的核心原因是JSON字符串里包含了未转义的换行符,违反了JSON的语法规范。咱们一步步来解决:
问题根源
你写的代码里,%({"description": "foo \n bar"})这个字符串在Crystal中会把\n解析成实际的换行字符(也就是ASCII的换行符),但JSON标准要求字符串中的换行必须转义为\n(也就是字面意义上的反斜杠加n),所以解析器会报错说遇到了意外的字符。
正确的解决方案
1. 修正JSON字符串的转义
在Crystal的字符串字面量中,要让JSON解析器看到\n,你需要把反斜杠转义一次(也就是写两个反斜杠\\n),这样Crystal会把\\n解析成单个的\n传给JSON解析器,符合JSON语法:
require "json" # 注意这里的\n被转义为\\n result = Hash(String, String).from_json(%({"description": "foo \\n bar"})) puts result["description"] # 输出: foo \n bar
2. 处理外部JSON源
如果你的JSON是从文件、API等外部来源获取的,只需要确保源JSON本身是符合规范的——也就是里面的换行符已经被正确转义为\n(即实际存储的字符是\+n,而不是直接的换行),Crystal的from_json方法就能正常解析。
3. 另一种写法:使用双引号字符串并转义
如果你不用%()语法,直接用双引号字符串,同样需要转义反斜杠:
require "json" result = Hash(String, String).from_json("{\"description\": \"foo \\n bar\"}")
内容的提问来源于stack exchange,提问作者epergo
相关产品推荐
相关产品推荐

