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()方法配置漂亮的打印。可以看到以前的代码的输出已经正确地缩进,并且阅读起来很愉快。

  • 相关阅读:
    [BJOI2019] 光线
    C# 从零开始写 SharpDx 应用 笔刷
    BAT 脚本判断当前系统是 x86 还是 x64 系统
    BAT 脚本判断当前系统是 x86 还是 x64 系统
    win2d 通过 CanvasActiveLayer 画出透明度和裁剪
    win2d 通过 CanvasActiveLayer 画出透明度和裁剪
    PowerShell 拿到显卡信息
    PowerShell 拿到显卡信息
    win10 uwp 如何使用DataTemplate
    win10 uwp 如何使用DataTemplate
  • 原文地址:https://www.cnblogs.com/mabingxue/p/8979400.html
Copyright © 2011-2022 走看看