JSON解析讲解

本文详细介绍了JSON的基本概念和语法,以及三种流行的Java JSON解析库——Gson, Fastjson和Jackson的使用方法,包括对象到JSON字符串的转换、JSON字符串到对象的反序列化,以及泛型对象的处理。通过示例代码展示了如何在实际开发中高效地操作JSON数据。
摘要由CSDN通过智能技术生成

JSON解析讲解

1.JSON

1.1 JSON概述
  • json:JavaScript Object Notation,js对象标记法。是一种轻量级的数据格式,可以代替XML

    1. JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
    2. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
    3. 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
    4. JSON易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
1.2 JSON语法
  • 定义的语法:

    • 对象形式:{"name":value, "name":value, ...}

      • 类似于js对象的格式:{key:value, key:value, ...}

      注意:在Java语法中,name/key的双引号不可省略!!!

    • 数组形式:[value1, value2, value3,...]

    • 混合形式:以上两种类型任意混合

1.3 JSON解析工具
  • Jackson:SpringMVC框架内置的工具包

  • jsonlib:Java提供的,不常用

    • 还有:jaxp,是Java提供的解析xml的工具包,用的也不多
  • gson:google提供的工具包,应用非常普遍,特别是国外

  • fastjson:Alibaba提供的工具包,高性能的,目前在国内使用越来越多

1.4 Gson解析工具
  1. Gson对象的创建

    1. 直接使用Gson构造方法创建;

      Gson gson = new Gson();
      
    2. 使用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();
      
  2. 常用方法

    1. public String toJson(Object src):将对象转换为JSON
    2. public <T> T fromJson(String json, Class<T> classOfT):普通对象解析
    3. public <T> T fromJson(String json, Type typeOfT):泛型对象解析(将JSON转换为泛型对象)
  3. 案例:

    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解析工具
  1. 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对象
    • 其中TypeReferencecom.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

  2. 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解析工具
  1. 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对象
  • 其中TypeReferencecom.fasterxml.jackson.core.type.TypeReference

    • 是一个抽象类,用于配置完整的泛型映射信息,避免泛型丢失的问题。用法示例:
    // List<User> 类型的映射信息
    TypeReference ref2 = new TypeReference<List<User>>() {};
    
    // Map<String,User> 类型的映射信息
    TypeReference ref3 = new TypeReference<Map<String,User>>(){};
    
  1. 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());
            }
    
        }
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值