背景
事情的起因是这样的。最近正在调试Socket.io的Android端接口。自己找到的Socket.io的Android的官方资料只是简单的字符串传递,而后台的接口则是一次性传递多组键值对参数,考虑到js的字典可以用类似json键值对来初始化,我就把参数直接拼接成了字符串进行测试。拼接方式如下
String str = "{\"key\":"+value+"}";
也就是使用最普通的java拼接字符串的方式,其中对字符串中的引号做了转义处理。这也发送到js服务端,打印信息可以打印出{“key”:”value}这样的字符串,但是js服务端并不能通过字典方式由键获取到值,而是直接当作字符串处理。
尝试多种方式之后,发现直接使用JSONObject,用put方法添加键值对,这样服务端就可以正确将参数解释为字典类型,同时我们在服务端打印数据时可以发现js将这些数据解析为Object类型,而不是我们之前所见字符串。
这说明JSONObject生成的json与我们直接拼写的是有区别的,这样在Socket.io的Android的sdk中对这个参数的处理方式肯定也不相同,眼见为实,现在我们打印一下处理完毕后即将发送的参数,看看两者有什么区别。
如图 前面一个json是JSONObject生成的json,而第二个是我们手动生成的,可以清楚发现,转意字符也在其中,通过网络流直接发送到服务端,服务端是无法直接用这些带转意字符的字符串创建字典数据的,但是这并不影响当做字符串打印。另外,如果我们将JSONObject对象进行toString操作,将生成的字符串当做参数传入,同样会引入转义字符,也是不可取的。
结论
在进行数据传输使用json时,我们尽可能使用JSONObject进行json生成,手动生成可能会引入其他转移字符活着多余的引号而导致其他一些问题。