zoukankan      html  css  js  c++  java
  • GSON速学必会

    一. GSON 简介

    GSON是一个Java语言编写的用于处理JSON数据格式的开源应用程序编程接口项目。它将Java对象转换为JSON表示。还可以用于将JSON字符串转换为等效的Java对象。

    gson包包含了JSON数据处理的所有常见类和接口。gson内部的子包reflectannotation, 和 streamreflect包包含处理Java泛型类型信息的类和接口。annotation包包含相关的类和接口,用于对象属性的自定义名称映射。stream包包含与读写相关的类和接口。

    GSON设计的初衷如下:

    • 有一个简单的转换机制,可以将Java对象转换为JSON。GSON Java项目有大量的实用方法作为api供开发人员使用。
    • 允许将先前存在的不可修改的Java对象转换为JSON和从JSON转换。
    • 定制对象的表示。GSON为对象字段提供了名称的自定义映射,同时将其序列化为JSON字符串。
    • 提供一个紧凑和格式化的输出。默认情况下,为Java对象生成的JSON字符串是紧凑的形式。GSON提供漂亮的打印设备以使其以人类可读的格式。

    1. 在 GSON 中创建你的第一个 JSON

    在本节中,将学习实例化GSON及其各种方法的含义,然后是一个快速示例代码,展示包装类型Java对象的基本序列化。

    步骤1 - 实例化GSON

    要使用GSON库,Gson类需要实例化一个com .google.GSON的对象。GSON对象不维护任何状态,这个特性有助于在多个地方重用GSON对象。

    GSON库提供了实例化的两种方法:

    • 默认方法
    • 构造器使用设置方法

    默认方法

    在这种方法中,可以使用new关键字实例化GSON类对象。这种方法创建了一个没有设置的object实例。

    构造器使用设置方法

    在这种方法中,可以使用GsonBuilder类和create方法创建一个GSON类对象:

    Gson gson = new GsonBuilder ().create ();

    前面的代码调用了GsonBuildercreate方法,它返回一个Gson对象进行初始化。

    下表列举了GSON公共的一些方法:

    方法描述
    fromJson 此方法用于反序列化以获取Java对象。 API中有此方法的重载的形式。
    toJson 该方法将Java对象序列化为等效的JSON表示形式。 API中有此方法的重载的形式。
    toJsonTree 该方法使用它们的泛型类型序列化对象。API中有此方法的重载的形式。

    2. 一个简单的例子

    让我们看看一个简单的例子代码,展示的基本使用GSON库对Java包装类进行序列化/反序列化对象的JSON字符串:

    import com.google.gson.Gson;
    
    public class QuickStartDemo {
    
        public static void main(String[] args) {
    
            Gson gson = new Gson();
    
        /*Java Wrapper Type*/
            String jsonInteger = gson.toJson(new Integer(1));
            String jsonDouble = gson.toJson(new Double(12345.5432));
    
            System.out.println("GSON toJson Method Use ");
            System.out.println(jsonInteger);
            System.out.println(jsonDouble);
    
            Integer javaInteger = gson.fromJson(jsonInteger, Integer.class);
            Double javaDouble = gson.fromJson(jsonDouble, Double.class);
    
            System.out.println("GSON fromJson Method Use ");
            System.out.println(javaInteger);
            System.out.println(javaDouble);
        }
    }

    输出结果为:

    GSON toJson Method Use
    1
    12345.5432
    GSON fromJson Method Use
    1
    12345.5432

    前面的代码演示了toJsonfromJson的两种方法的快速使用。

    在代码的第一部分中,使用默认方法实例化了一个Gson类对象,并使用值112345.5432实例化了两个Java 包装类对象,即Integer类和Double类。这些对象传递给toJson方法,该方法生成JSON等效字符串形式。

    方法                          详细说明
    toJSON        参数:使用Java类对象进行序列化。 返回:JSON对象的字符串表示形式
    fromJSON   参数:第一个参数是JSON表示的字符串类型,第二个参数是预期的Java类类型。返回:预期的Java类对象

    在代码的最后一部分中,JSON等效字符串传递给fromJson方法。 该方法有两个参数,第一个参数是一个字符串,第二个参数是一个预期的Java类类型。 fromJson方法的返回类型始终是Java类型。

    二. 需要知道的12个GSON特性

    在本节中,将了解GSON库支持的主要功能以及如何实现这些功能。

    1. 对 Java 对象的支持

    GSON中的对象被称为JsonElement的类型:

    GSON库可以将任何用户定义的类对象转换为JSON表示。Student类是一个用户定义的类,GSON可以将任何Student对象序列化为JSON。
    以下是 Student.java 的代码:

    package com.lee.jsondemo;
    
    public class Student {
    
        private String name;
    
        private String subject;
    
        private int mark;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSubject() {
            return subject;
        }
    
        public void setSubject(String subject) {
            this.subject = subject;
        }
    
        public int getMark() {
            return mark;
        }
    
        public void setMark(int mark) {
            this.mark = mark;
        }
    
    }

    Student类进行操作的JavaObjectFeaturesUse.java代码如下:

    import com.google.gson.Gson;
    importcom.packt.chapter.vo.Student;
    
    public class JavaObjectFeaturesUse {
    
    public static void main(String[] args){
    
    Gsongson = new Gson();
    
    Student aStudent = new Student();
    aStudent.setName("Sandeep");
    aStudent.setMark(128);
    aStudent.setSubject("Computer Science");
    
    String studentJson = gson.toJson(aStudent);
    System.out.println(studentJson);
    
    Student anotherStudent = gson.fromJson(studentJson, Student.class);
    System.out.println(anotherStudentinstanceof  Student);
      }
    }

    执行结果为:

    {"name":"Sandeep","subject":"Computer Science","mark":128}
    true

    上面的代码创建了一个name属性为sandeep的学生对象,subject属性设置为Computer Sciencmark128。然后将一个Gson对象实例化,并将学生对象作为一个参数传递给toJson()方法。它返回一个字符串,该字符串具有Java对象的JSON表示。该字符串作为控制台中的第一行打印。学生对象的输出JSON表示是键/值对的集合。学生类的Java属性成为JSON字符串中的键。

    在代码的最后一部分中,fromJson()方法将JSON生成的字符串作为第一个输入参数,Student.class作为第二个参数,将JSON字符串转换回Java对象。代码的最后一行使用Student作为第二行操作符的实例来验证由fromJson()方法生成的Java对象是否是Student类型的。在控制台中,它输出true,则表示我们将得到与JSON相同的值。

    2. 序列化与反序列化

    GSON有一些类的隐式序列化,比如Java包装类(IntegerLongDouble等等)、Java.net.urljava.net.URIjava.util.Date,等等。

    让我看个例子:

    import java.util.Date;
    import com.google.gson.Gson;
    
    public class InbuiltSerializerFeature {
        public static void main(String[] args) {
            Date aDateJson = new Date();
            Gson gson = new Gson();
            String jsonDate = gson.toJson(aDateJson);
            System.out.println(jsonDate);
        }
    }

    输出结果为:

    "Sep 15, 2017 10:38:35 PM"

    前面的代码是将Java的Date类对象序列化为JSON表示。在前面的部分中,您已经了解了如何使用GSON来序列化和反序列化对象,以及它如何为用户定义的Java类对象提供定制化的序列化器和反序列化器。让我们看看它是如何工作的。

    另外,GSON还为开发人员提供了可定制的序列化的特性。

    下面的代码是一个可定制序列化器的示例:

    public class StudentTypeSerializer implements JsonSerializer<Student> {
    
        @Override
        public JsonElement serialize(Student student, Type type,
                                     JsonSerializationContext context) {
            JsonObject obj = new JsonObject();
    
            obj.addProperty("studentname", student.getName());
            obj.addProperty("subjecttaken", student.getSubject());
            obj.addProperty("marksecured", student.getMark());
    
            return obj;
        }
    }

    下面的代码是一个自定义反序列化器的例子:

    class StudentTypeDeserializer implements JsonDeserializer<Student> {
    
        @Override
        public Student deserialize(JsonElement jsonelment, Type type,
                                   JsonDeserializationContext context) throws JsonParseException {
    
            JsonObject jsonObject = jsonelment.getAsJsonObject();
    
            Student aStudent = new Student();
            aStudent.setName(jsonObject.get("studentname").getAsString());
            aStudent.setSubject(jsonObject.get("subjecttaken").getAsString());
            aStudent.setMark(jsonObject.get("marksecured").getAsInt());
    
            return aStudent;
        }
    }

    以下代码测试自定义序列化器和反序列化器:

    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class CustomSerializerFeature {
    
        public static void main(String[] args) {
    
            GsonBuilder gsonBuilder = new GsonBuilder();
    
            gsonBuilder.registerTypeAdapter(Student.class, new StudentTypeSerializer());
    
            Gson gson = gsonBuilder.create();
    
            Student aStudent = new Student();
    
            aStudent.setName("Sandeep");
    
            aStudent.setMark(150);
    
            aStudent.setSubject("Arithmetic");
    
            String studentJson = gson.toJson(aStudent);
    
            System.out.println("Custom Serializer : Json String Representation ");
            System.out.println(studentJson);
    
            gsonBuilder.registerTypeAdapter(Student.class, new StudentTypeDeserializer());
            Gson gsonde = gsonBuilder.create();
            Student deStudent = gsonde.fromJson(studentJson, Student.class);
            
            System.out.println("Custom DeSerializer : Java Object Creation");
            
            System.out.println("Student Name " + deStudent.getName());
            System.out.println("Student Mark " + deStudent.getMark());
            System.out.println("Student Subject " + deStudent.getSubject());
            System.out.println("is anotherStudent is type of Student " + (deStudent instanceof Student));
        }
    }

    输出结果为:

    Custom Serializer : Json String Representation 
    {"studentname":"Sandeep","subjecttaken":"Arithmetic","marksecured":150}
    Custom DeSerializer : Java Object Creation
    Student Name Sandeep
    Student Mark 150
    Student Subject Arithmetic
    is anotherStudent is type of Student true

    3. 漂亮的打印

    GSON的序列化输出的JSON表示格式紧凑。如果有大量的Java对象集合,并且每个对象都有许多序列化的属性,那么它们紧凑的JSON表示的可读性是非常差的,而且看起来很难看。

    为了解决这个问题,GsonBuilder支持漂亮的打印配置,同时为序列化使用创建一个Gson对象。这个漂亮的打印功能通过适当的标签缩进和新的换行来美化JSON字符串的输出。

    以下是关于格式化程序的一些重要内容:

    • JsonPrintFormatterJsonCompactFormatter是GSON中的两种格式化类型的表示。
    • JsonCompactFormatter是GSON的默认格式化程序。
    • JsonPrintFormatter用于漂亮的打印,它不会暴露在API中。所以开发者不能修改。
    • JsonPrintFormatter支持一个默认行长度为80个字符,两个字符缩进,以及右侧保持四个字符。
    • 可以通过调用GsonBuildersetPrettyPrinting()方法来使用JsonPrintFormatter

    具体看一个例子:

    import java.util.ArrayList;
    import java.util.List;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.packt.chapter.vo.Student;
    
     public class PrettyPrintFeature {
    
    
      public static void main(String[] args) {
    
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        List<Student> listOfStudent = new ArrayList<Student>();
    
        Student student1 = new Student();
        student1.setName("Sandeep Kumar Patel");
        student1.setSubject("Arithmetic");
        student1.setMark(234);
    
        Student student2 = new Student();
        student2.setName("Sangeeta Patel");
        student2.setSubject("Geography");
        student2.setMark(214);
    
        listOfStudent.add(student1);
        listOfStudent.add(student2);
    
        String prettyJsonString = gson.toJson(listOfStudent);
        System.out.println(prettyJsonString);
      }
    
    }

    输出结果为:

    [
      {
        "name": "Sandeep Kumar Patel",
        "subject": "Arithmetic",
        "mark": 234
      },
      {
        "name": "Sangeeta Patel",
        "subject": "Geography",
        "mark": 214
      }
    ]

    上面的代码将学生列表序列化为JSON表示。它使用GsonBuilder类获得一个Gson对象。使用setPrettyPrinting()方法配置漂亮的打印。可以看到以前的代码的输出已经正确地缩进,并且阅读起来很愉快。

  • 相关阅读:
    概率期望训练之五
    概率期望训练之四
    JavaScript Source Map详解
    JSON.parse、JSON.stringify
    Linux cp命令直接覆盖不提示方法
    Service Worker
    HTML5 应用程序缓存
    二分图
    Tarjan
    FFT迭代加深 & NTT 多项式求逆
  • 原文地址:https://www.cnblogs.com/mabingxue/p/8979400.html
Copyright © 2011-2022 走看看