JSON字符串在线格式化工具:JSON在线格式化
1. JSON字符串格式 同步请求
中,数据从后台到前端,需要将数据对象存储在 域对象
中;异步请求
中,数据从后台到前端,需要将数据对象转换为 JSON 字符串
。 根据 JavaBean 对象生成对应的 JSON 字符串。
1 2 3 4 { "键1" : 值1 , "键2" : 值2 } [ { "键1" : 值1 , "键2" : 值2 } , { "键1" : 值1 , "键2" : 值2 } ]
2. JSON 在 Java 中的转换
2.1 FastJSON 使用 依赖 jar 包:
将JavaBean序列化为JSON文本: public static final String toJSONString
(Object object); 把JSON文本解析为JavaBean: public static final <T> T parseObject
(String text, Class<T> clazz);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 class User { private String username; private String password; }@Test public void objectTOJson () { User user = new User ("dmego" , "123456" ); String UserJson = JSON.toJSONString(user); System.out.println("简单java类转json字符串:" +UserJson); User user1 = new User ("zhangsan" , "123123" ); User user2 = new User ("lisi" , "321321" ); List<User> users = new ArrayList <User>(); users.add(user1); users.add(user2); String ListUserJson = JSON.toJSONString(users); System.out.println("List<Object>转json字符串:" +ListUserJson); UserGroup userGroup = new UserGroup ("userGroup" , users); String userGroupJson = JSON.toJSONString(userGroup); System.out.println("复杂java类转json字符串:" +userGroupJson); }@Test public void JsonTOObject () { String jsonStr1 = "{'password':'123456','username':'dmego'}" ; User user = JSON.parseObject(jsonStr1, User.class); System.out.println("json字符串转简单java对象:" +user.toString()); String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]" ; List<User> users = JSON.parseArray(jsonStr2, User.class); System.out.println("json字符串转List<Object>对象:" +users.toString()); String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}" ; UserGroup userGroup = JSON.parseObject(jsonStr3, UserGroup.class); System.out.println("json字符串转复杂java对象:" +userGroup); }
2.2 Jackson 使用 依赖 jar 包:
jackson-annotations-2.9.9.jar
jackson-core-2.9.9.jar
jackson-databind-2.9.9.jar
将JavaBean序列化为JSON文本: public String writeValueAsString
(Object value) throws JsonProcessingException; 把JSON文本解析为JavaBean: public <T> T readValue
(String content, Class<T> valueType) throws JsonParseException;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Province { private Integer pId; private String pName; private List<City> cityList; }public class TestJackson { public static void main (String[] args) throws Exception { Province p1 = new Province (1 , "河南省" ); List<City> cityList = new ArrayList <>(); cityList.add(new City (11 , "郑州市" )); cityList.add(new City (11 , "洛阳市" )); cityList.add(new City (11 , "开封市" )); p1.setCityList(cityList); ObjectMapper objectMapper = new ObjectMapper (); String json1 = objectMapper.writeValueAsString(p1); System.out.println(json1); Province province = objectMapper.readValue(jsonP1, Province.class); List list = objectMapper.readValue(jsonList, List.class); Map map = objectMapper.readValue(jsonMap, Map.class); } }
2.3 Gson 使用 依赖 jar 包:
将JavaBean序列化为JSON文本: public String toJson
(Object src); 把JSON文本解析为JavaBean: public <T> T fromJson
(String json, Class<T> classOfT) throws JsonSyntaxException;
1 2 3 4 5 6 7 8 Gson gson = new Gson ();User user = new User ("张三" ,24 );String jsonObject = gson.toJson(user); Gson gson = new Gson ();String jsonString = "{\"name\":\"张三\",\"age\":24}" ;User user = gson.fromJson(jsonString, User.class);
2.4 三种工具性能对比 三种工具均可转换:
【总结】
Java对象JSON序列化 :Jackson速度最快
,在测试中比Gson快接近50%,FastJSON和Gson速度接近。
JSON反序列化成Java对象 : FastJSON、Jackson速度最快
且接近,Gson速度稍慢,不过差距很小。
复杂的JSON结构转换稳定性 : Gson成功率明显比FastJSON、Jackson都要高,复杂JSON结构转换时稳定性Gson最好
。
3. JSON 在 JavaScript 中的转换 JSON全局对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <html><head > <title > 测试json</title > <script > function f_json ( ) { var user = { "name" : "周杰伦" , "address" : "中国台湾" }; var str = JSON .stringify (user); alert (str); var zxy = JSON .parse (str); alert (zxy.name + "," + zxy.address ); } </script > </head > <body > <button onclick ="f_json()" > 测试</button > </body > </html>
eval() 全局方法:
1 2 3 4 5 6 <script> var jsonStr = '{"username":"root", "password":"1234"}' ; var obj = eval ("(" + jsonStr + ")" ); console .log (obj.username + "," + obj.password ); </script>
4. JSON字符串序列化顺序 json字符串序列化后如何保持顺序不变
使用阿里巴巴的fastjson对json字符串进行序列化,序列化之后发现顺序发生了改变,导致之后业务出现问题。
解决方法:
1 2 3 LinkedHashMap<String, Object> json = JSON.parseObject(message, LinkedHashMap.class, Feature.OrderedField);JSONObject jsonObject = new JSONObject (true ); jsonObject.putAll(json);
先将字符串转化为LinkedHashMap,然后定义有序的json对象,将map对象复制到json对象中即可。
其实
1 2 3 LinkedHashMap<String, Object> json=这边设置获取数据;JSONObject jsonObject = new JSONObject (true ); jsonObject.putAll(json);
json顺序也不变了。