JSON解析讲解
文章目录
1.JSON
1.1 JSON概述
-
json:JavaScript Object Notation,js对象标记法。是一种轻量级的数据格式,可以代替XML
- JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
- 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- JSON易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
1.2 JSON语法
-
定义的语法:
-
对象形式:
{"name":value, "name":value, ...}
- 类似于js对象的格式:
{key:value, key:value, ...}
注意:在Java语法中,name/key的双引号不可省略!!!
- 类似于js对象的格式:
-
数组形式:
[value1, value2, value3,...]
-
混合形式:以上两种类型任意混合
-
1.3 JSON解析工具
-
Jackson:SpringMVC框架内置的工具包
-
jsonlib:Java提供的,不常用
- 还有:jaxp,是Java提供的解析xml的工具包,用的也不多
-
gson:google提供的工具包,应用非常普遍,特别是国外
-
fastjson:Alibaba提供的工具包,高性能的,目前在国内使用越来越多
1.4 Gson解析工具
-
Gson对象的创建
-
直接使用Gson构造方法创建;
Gson gson = new Gson();
-
使用GsonBuilder创建;
Gson gson = new GsonBuilder().create();
相比直接使用构造方法,GsonBuilder创建的方式更灵活,因为它支持对Gson的配置,如下
Gson gson = new GsonBuilder() //序列化null .serializeNulls() // 设置日期时间格式,另有2个重载方法 // 在序列化和反序化时均生效 .setDateFormat("yyyy-MM-dd") // 禁此序列化内部类 .disableInnerClassSerialization() //生成不可执行的Json(多了 )]}' 这4个字符) .generateNonExecutableJson() //禁止转义html标签 .disableHtmlEscaping() //格式化输出 .setPrettyPrinting() .create();
-
-
常用方法
public String toJson(Object src)
:将对象转换为JSONpublic <T> T fromJson(String json, Class<T> classOfT)
:普通对象解析public <T> T fromJson(String json, Type typeOfT)
:泛型对象解析(将JSON转换为泛型对象)
-
案例:
public class JsonDemo01 { public static void main(String[] args) { User user = new User("嫦娥", 18); // 1.创建Gjson解析对象 Gson gson = new Gson(); // 2.java对象转换为json字符串 String userJson = gson.toJson(user); // {"name":"嫦娥","age":18} System.out.println(userJson); // 3.json字符串转换为对象 User fromJson = gson.fromJson("{\"name\":\"嫦娥\",\"age\":18}", User.class); System.out.println(fromJson); // 4.解析对象为Map集合 HashMap map = gson.fromJson("{\"name\":\"嫦娥\",\"age\":18}", HashMap.class); System.out.println("name->" + map.get("name")); // 5.集合的解析 List<User> userList = new ArrayList<>(); User user1 = new User("天蓬元帅", 18); userList.add(user); userList.add(user1); Map<String, User> userMap = new HashMap<>(); userMap.put("u", user); userMap.put("u1", user1); System.out.println("userList: " + gson.toJson(userList)); // [{"name":"嫦娥","age":18},{"name":"天蓬元帅","age":18}] String listJson = gson.toJson(userList); System.out.println(listJson); // {"u":{"name":"嫦娥","age":18},"u1":{"name":"天蓬元帅","age":18}} listJson = gson.toJson(userMap); System.out.println(listJson); // 转换为字符串数组 String jsonArray = "[\"Android\",\"Java\",\"PHP\"]"; String[] strArray = gson.fromJson(jsonArray, String[].class); System.out.println("strArray: " + Arrays.toString(strArray)); // 转化为List集合 List<String> listFromJson = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType()); System.out.println("listFromJson" + listFromJson); } }
1.5 FastJason解析工具
-
fastjson的API介绍
- fastjson提供了核心类:
JSON
JSON
提供了一些常用的静态方法:
方法 说明 toJSONString(Object obj)
把obj对象里的数据转换成json格式 parseObject(String json, Class type)
把json字符串,还原成type类型的Java对象 parseObject(String json, TypeReference reference)
把json字符串,还原成带泛型的复杂Java对象 -
其中
TypeReference
:com.alibaba.fastjson.TypeReference
- 是一个抽象类,用于配置完整的泛型映射信息,避免泛型丢失的问题
// List<Integer> 类型的映射信息 TypeReference ref1 = new TypeReference<List<Integer>>() {}; // List<User> 类型的映射信息 TypeReference ref2 = new TypeReference<List<User>>() {}; // Map<String,User> 类型的映射信息 TypeReference ref3 = new TypeReference<Map<String,User>>(){};
注意:
。TypeReference
的构造方法是protected
修饰的,所以上面才会写成new TypeReference<>() {}
而不是new TypeReference>()
TypeReference
为抽象类,此处构造实例的写法为匿名内部类的写法。
参考:https://www.jianshu.com/p/e740196225a4
- fastjson提供了核心类:
-
fastjson使用案例
public class JsonDemo02 { public static void main(String[] args) { User user = new User("嫦娥", 18); User user1 = new User("天蓬元帅", 20); ArrayList<User> list = new ArrayList<>(); list.add(user); list.add(user1); HashMap<String, User> map = new HashMap<>(); map.put("u", user); map.put("u1", user1); // 1.`toJSONString(Object obj)` 把obj对象里的数据转换成json格式 String userJson = JSON.toJSONString(user); System.out.println(userJson); String listJson = JSON.toJSONString(list); String mapJson = JSON.toJSONString(map); System.out.println("userListJson: " + listJson); System.out.println("userMapJson: " + mapJson); // 2.`JSON.parseObject(String json, Class type)`把json字符串,还原成type类型的Java对象 User userFromJson = JSON.parseObject(userJson, User.class); System.out.println(userFromJson); // 复杂Java对象还原 // 3.`JSON.parseObject(String json, TypeReference reference)`把json字符串,还原成带泛型的复杂Java对象 TypeReference<List<User>> listRef = new TypeReference<List<User>>() {}; List<User> userList = JSON.parseObject(listJson, listRef); System.out.println(userList); HashMap<String, User> userMap = JSON.parseObject(mapJson, new TypeReference<HashMap<String, User>>(){}); Iterator<Map.Entry<String, User>> iterator = userMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, User> entry = iterator.next(); System.out.println(entry.getKey() + "->" + entry.getValue()); } } }
1.6 Jackson解析工具
-
Jackson的API介绍
- Jackson提供了转换的核心类:
ObjectMapper
ObjectMapper
的构造方法:无参构造ObjectMapper
的常用方法:
方法 说明 writeValueAsString(Object obj)
把obj对象里的数据转换成json格式 readValue(String json, Class type)
把json字符串,还原成type类型的Java对象 readValue(String json, TypeReference reference)
把json字符串,还原成带泛型的复杂Java对象 - Jackson提供了转换的核心类:
-
其中
TypeReference
,com.fasterxml.jackson.core.type.TypeReference
- 是一个抽象类,用于配置完整的泛型映射信息,避免泛型丢失的问题。用法示例:
// List<User> 类型的映射信息 TypeReference ref2 = new TypeReference<List<User>>() {}; // Map<String,User> 类型的映射信息 TypeReference ref3 = new TypeReference<Map<String,User>>(){};
-
Jackson的使用示例
public class JsonDemo03 { public static void main(String[] args) throws IOException { User user = new User("嫦娥", 18); User user1 = new User("天蓬元帅", 20); ArrayList<User> list = new ArrayList<>(); list.add(user); list.add(user1); HashMap<String, User> map = new HashMap<>(); map.put("u", user); map.put("u1", user1); // 0.创建Jackson解析对象 ObjectMapper mapper = new ObjectMapper(); // 1.`toJSONString(Object obj)` 把obj对象里的数据转换成json格式 String userJson = mapper.writeValueAsString(user); System.out.println(userJson); String listJson = mapper.writeValueAsString(list); String mapJson = mapper.writeValueAsString(map); System.out.println("userListJson: " + listJson); System.out.println("userMapJson: " + mapJson); // 2.把json字符串,还原成Java对象 User userFromJson = mapper.readValue(userJson, User.class); System.out.println(userFromJson); // 复杂Java对象还原 // 3.把json字符串,还原成带泛型的复杂Java对象 TypeReference<List<User>> listRef = new TypeReference<List<User>>(){}; List<User> userList = mapper.readValue(listJson, listRef); System.out.println(userList); HashMap<String, User> userMap = mapper.readValue(mapJson, new TypeReference<HashMap<String, User>>(){}); Iterator<Map.Entry<String, User>> iterator = userMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, User> entry = iterator.next(); System.out.println(entry.getKey() + "->" + entry.getValue()); } } }