Java:检测对JSON不正确的控制字符

我正在重新发明轮子并在Java中创建自己的JSON解析方法。

我要去json.org上的(非常好的!)文档。 我不确定的唯一部分是它所说的“或控制性格”

由于文档非常清晰,并且JSON非常简单易于实现,我认为我会继续使用规范而不是松散。

我如何正确地删除Java中的控制字符? 也许有一个unicode系列?

在此处输入图像描述


编辑:A(通常?)缺少谜题

我被告知 在定义的范围 1 2之外还有其他控制字符在标记中可能很麻烦。

最值得注意的是字符U + 2028和U + 2029,线和段落分隔符,它们充当换行符。 在字符串文字的中间注入换行符很可能会导致语法错误(未终止的字符串文字)。 3

虽然我认为这不会造成XSS威胁,但为标签中的使用添加额外规则仍然是个好主意。

  • 只需简单并使用\u表示法编码所有非“ASCII可打印”字符。 这些角色开始时并不常见。 如果您愿意,可以添加到白名单,但我建议使用白名单方法。
  • 如果您不知道, 请不要忘记 </script (不区分大小写),这可能会导致HTML脚本注入您的页面 。 默认情况下,这些字符都不是以JSON编码的。

Character.isISOControl(…)会吗? 顺便提一下,UTF-16是Unicode代码点的编码……您是要在字节级别还是在字符/代码点级别进行操作? 我建议将UTF-16的映射保留到Java核心API的字符流中……

即使它不是非常具体,我也会假设它们引用Unicode规范中的“控制”字符类别 。

在Java中,您可以使用以下表达式检查字符c是否为Unicode控制字符: Character.getType(c) == Character.CONTROL

我相信控制字符的Unicode定义是:

U + 0000..U + 001F和U + 007F..U + 009F范围内的65个字符。

这是他们对控制代码的定义,但上面跟着句子“又称控制字符”。 所以……

我知道这个问题已在几年前提出,但无论如何我都在回答,因为接受的答案是不正确的。

 Character.isISOControl(int codePoint) 

进行以下检查:

 (codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F); 

JSON规范定义在https://tools.ietf.org/html/rfc7159 :

  1. 字符串

    字符串的表示类似于C系列编程语言中使用的约定。 字符串以引号开头和结尾。 除了必须转义的字符外,所有Unicode字符都可以放在引号内:引号,反向固定和控制字符(U + 0000到U + 001F)。

 Character.isISOControl(int codePoint) 

将标记所有需要转义的字符(U+0000-U+001F) ,但它也会标记不需要转义的字符(U+007F-U+009F) 。 不需要转义字符(U+007F-U+009F)