JSON对象(JavaScript Object Notation,JavaScript对象表示法)。这看似只存是位JavaScript所定制的,但它作为一种语法是独立于语言以及平台的。只是说通常情况下我们在客户端(浏览器)向服务器端传递数据时,使用的是JSON格式,而这个格式是用于表示JavaScript对象。它是由一系列的“key-value”组成,如 {“id”: 1, “name”: “kevin”},这有点类似Map键值对的存储方式。在Java中所述的JSON对象,实际是指的JSONObject类,这在各个第三方的JSONjar包中通常都以这个名字命名,不同jar包对其内部实现略有不同。
JSON字符串。JSON对象和JSON字符串之间的转换是序列化与反序列化的过程,这就是好比Java对象的序列化与反序列化。在网络中数据的传递是通过字符串,或者是二进制流等等进行的,也就是说在客户端(浏览器)需要将数据以JSON格式传递时,此时在网络中传递的是字符串,而服务器端在接收到数据后当然也是字符串(String类型),有时就需要将JSON字符串转换为JSON对象再做下一步操作(String类型转换为JSONObject类型)。
项目中实际使用存在的一些坑:
1、JSONObject jsonObj = JSONObject.fromObject(map).toString() 会将实体类中的参数改变。
例如实体类User中存在一个参数:pId(long 型)
JSONObject resultJson = new JSONObject();
List<User> list = UserService.get(id);
JSONArray newArr = JSONArray.fromObject(list);
resultJson.put("act_list", newArr);
response.setContentType("text/json; charset=utf-8");
response.getWriter().print(resultJson);
返回的json字符串:[{"id":"123","PId":"123456" }]; pId 被默认转换成了PId,导致前台页面取不到值。
而用com.google.gson.JsonObject则没有这种情况。
2、JSONObject jsonObj = JSONObject.fromObject(map).toString() 会将Double类型的1.0/0.0等数据强制转换为1/0 导致数据格式问题,而0.01等类型数据不会被转换。。。没有找到解决办法,只好换了Gson,而没有出现该问题。
网上查了查原因: