空格、NBSP 造成的 JSON 解析失败问题

Postman测试接口时,将postman中的body json数据用微信发送给同事,同事直接复制后到postman中发起请求,结果报错

"JS0N parse error: Invalid UTF-8 start byte 0xa0; nested exception is com.fasterxml.jackson.core.JsonarseException: Invalid UTF-8 startat [Source: (PushbackInputStream): line: 2, column: 3]"

但是在我这是没有问题的,对比了之前的 json 和微信里的 json,几乎没什么区别,研究了很久,才发现问题所在。

相同的json数据在本地postman中及微信消息中的区别(微信消息的空格点少,本地postman的空格点多)

unicode 表示(以{ "a":""}为例)

2个点空格的

\u007b\u00a0\u0020\u00a0\u0020\u0022\u0061\u0022\u003a\u0022\u0022\u007d

4个点空格的

\u007b\u0020\u0020\u0020\u0020\u0022\u0061\u0022\u003a\u0022\u0022\u007d

可以看到,它们的区别在于 { 后面的空格,2个点空格的是 \u00a0\u0020 交替,4个点空格的都是 \u0020。(\u00a0 代表 NBSP,\u0020 代表空格)

在IDEA中也能看出区别

结论:微信消息有时会把json中的两个空格(即\u0020\u0020),转为一个 NBSP 和一个空格(即\u00a0\u0020

解决方法

  1. 将postman测试json发送到微信时,最好发送postman的Code snippet 的curl请求代码,这样可以将curl请求直接导入到postman中。(这里的空格不会被转换)
  2. 如果从微信中复制的json数据,可以用postman进行beautify,这样也可以将json数据转化回来。