通过JSONObject传递Unicode字符串时发生java错误
我必须将unicode字符串传递给JSONObject
JSONObject json = new JSONObject("{\"One\":\"\\ud83c\\udf45\\ud83c\\udf46\"}");
json.put("Two", "\ud83c\udf45\ud83c\udf46");
System.out.println(json.toString());
但我有这个:
{"One":"🍅🍆","Two":"🍅🍆"}
我想要这个:
{"One":"\ud83c\udf45\ud83c\udf46","Two":"\ud83c\udf45\ud83c\udf46"}
# 1 楼答案
系统正在按设计工作。您只是没有考虑到JSON不需要将大多数Unicode字符格式化为
\uXXXX
格式。某些转义字符必须为\X
格式,而控制字符<;=0x1F必须为\uXXXX
格式,但任何其他字符可以为\uXXXX
格式,但不是必需的格式。您显示的字符不属于这些范围,这就是为什么toString()
没有以\uXXXX
格式对它们进行编码当您调用
new JSONObject(String)
时,它会将输入字符串解码为实际的Unicode字符串,就好像您是这样做的:这很好。您希望
JSONObject
在内部保存未转义的Unicode数据你被绊倒的地方是
JSONObject.toString()
没有将特定的Unicode字符格式化为\uXXXX
格式。这是非常有效的JSON,但不是您想要的格式(为什么要这样格式化?)查看Java的
JSONStringer
类(实现JSONObject.toString()
)的源代码可以发现,它只格式化非保留控制字符<;=0x1F在\uXXXX
格式中,其他非保留字符按原样格式化。这符合JSON规范要执行您要求的操作,您必须在调用
JSONObject.toString()
以正常格式化保留字符和ASCII字符后,根据需要手动格式化Unicode字符,例如:# 2 楼答案
一种方法是:
当您试图打印JSON时,这将打印字符串literal
\ud83c\udf45