将含换行符的JSON对象{"some":"thing\n"}转为Unicode是否为有效JSON?
先结合你引用的JSON RFC规范基础:
根据JSON RFC规范:JSON文本是一系列标记的序列。标记集包含六个结构字符、字符串、数字以及三个字面量名称。JSON文本是一个序列化的对象或数组。JSON-text = object / array。六个结构字符如下:begin-array = ws %x5B ws ; [ 左方括号;begin-object = ws %x7B ws ; { 左花括号;end-array = ws %x5D ws ; ] 右方括号;end-object = ws %x7D ws ; } 右花括号;name-separator = ws %x3A ws ; : 冒号...
接下来要分两种常见的“转换为Unicode格式”场景来分析,结论有所不同:
场景1:将JSON文本以Unicode编码(如UTF-8/UTF-16)存储或传输
这种情况转换后的JSON完全有效。
你提供的原始JSON {"some":"thing\n"} 本身就符合规范:它是一个合法的顶级对象(满足JSON-text = object / array要求),字符串里的\n是RFC允许的转义序列,对应Unicode换行符U+000A。
JSON RFC明确允许使用UTF-8、UTF-16或UTF-32作为文本编码,所以只要你只是把这段JSON的字节表示转换成标准Unicode编码(比如从ASCII转成UTF-8),整个结构和内容都没有被修改,自然还是有效的JSON。
场景2:将字符串中的转义序列\n替换为实际的Unicode换行字符(U+000A)
这种情况转换后的JSON是无效的。
如果把原始JSON改成下面这样(字符串中直接包含换行符):
{"some":"thing "}
这就违反了JSON字符串的核心规则:RFC要求字符串中的控制字符(U+0000到U+001F,包括换行符U+000A)必须通过转义序列(比如\n)来表示,不能直接出现在未转义的字符串内容里——这类控制字符不在“无需转义的可打印Unicode字符”范围内,直接写入会导致JSON格式非法。
内容的提问来源于stack exchange,提问作者SecResearcher

