Gson使用方法

2023-05-16

在这里插入图片描述

一、概述
Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛,所以非常有必要对其进行系统的学习。
json是一种数据格式,确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。
目前大多数的网络通讯格式已经从xml替换为json格式。
其提供了序列化和反序列化的功能。在我们进行网络开发的过程中通常会把参数封装成json格式传给后台,后台解析后的返回结果也会封装成json格式返回给调用者。

1.如何创建一个Gson对象

/**
     * 创建Gson对象的两种形式
     */
    private void createGsonObject() {
        //第一种方式
        Gson gson = new Gson();
        //第二种方式
        Gson gson1 = new GsonBuilder().create();
        //方式二除了可以创建一个Gson对象以外还可以进行多项配置,例如,设置日期的格式化
//       例如: new GsonBuilder().setDateFormat("yyyy-MM-dd");
    }

2.如何创建一个JsonObject

/**
     * 如何创建一个json对象
     */
    private void createJsonObject() {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("id", "1");//给jsonObject创建一个id属性值为1
        jsonObject.addProperty("bookName", "《深入Java虚拟机》");
        jsonObject.addProperty("bookPrice", 36.8);
        jsonObject.addProperty("bookColor", "红色");
        //打印Json字符串
        System.out.println(jsonObject.toString());
        //给JsonObject添加对象
        JsonObject jsonObject1 = new JsonObject();
        jsonObject1.addProperty("chapterId", "1");
        jsonObject1.addProperty("chapterName", "第一章");
        //给JsonObject添加实体对象
        jsonObject.add("chapter", jsonObject1);
        System.out.println(jsonObject.toString());
		
		/**
		 * 输出结果:
		 * {"id":"1","bookName":"《深入Java虚拟机》","bookPrice":36.8,"bookColor":"红色"}
		 * {"id":"1","bookName":"《深入Java虚拟机》","bookPrice":36.8,"bookColor":"红色","chapter":{"chapterId":"1","chapterName":"第一章"}}
		 */

    }

注:这里的JsonObject表示我们一样可以创建一个json对象;但是我们后面一般使用的是java对象跟json字符串的转换,可以用通过创建好的gson对象来操作。

3.数组的序列化与反序列化

	/**
     * 根据一个json创建一个数组
     */
    private void createJsonArray() {
        //把数组转换为Json字符串
		String[] str = new String[]{"《深入Java虚拟机》", "《Android插件编程》", "《OpenCV全解》"};
		Gson gson = new Gson();
		String jsonStr = gson.toJson(str);//先创建一个Json字符串
		System.out.println(jsonStr);//输出
		//把Json字符串转换为Json数组
		String[] strArray = gson.fromJson(jsonStr, String[].class);
		for (String s : strArray) {
			System.out.println(s);
		}

		/**
		 * 输出结果:
		 * ["《深入Java虚拟机》","《Android插件编程》","《OpenCV全解》"]
		 * 《深入Java虚拟机》
		 * 《Android插件编程》
		 * 《OpenCV全解》
		 */
    }

4.List的序列化与反序列化

 	/**
     * 根据一个json创建一个list
     */
    private void createJsonToList() {
        //将list集合转换为json字符串
        List<Book> books = new ArrayList<>();
        books.add(new Book("1", "《深入Java虚拟机》"));
        books.add(new Book("2", "《OpenCV进阶》"));
        books.add(new Book("3", "《深入Android源代码》"));
        Gson gson = new Gson();
        String jsonListStr = gson.toJson(books);
        System.out.println(jsonListStr);
        //将json字符串转换为list集合
        //获取泛型的类型
        Type type = new TypeToken<List<Book>>() {
        }.getType();
        //使用gson将字符串转换为泛型集合,即List<Book>
        List<Book> books1 = gson.fromJson(jsonListStr, type);
        for (Book book : books1) {
            System.out.println(book.getName());
        }
        
		/**
		 * 输出结果:
		 * [{"id":"1","name":"《深入Java虚拟机》"},{"id":"2","name":"《OpenCV进阶》"},{"id":"3","name":"《深入Android源代码》"}]
		 * 《深入Java虚拟机》
		 * 《OpenCV进阶》
		 * 《深入Android源代码》
		 */
    }

注:

//获取泛型的类型
Type type = new TypeToken<List<Book>>() {
        }.getType();*

5.序列化与反序列化综合例子(基于Book对象)

public class Book {
    public Book(){}
    private String id;
    /**
     * 加上@SerializedName注解后服务端api返回bookName、Name、bn时,客户端都能够拿到正确的值给name属性。
     */
    @SerializedName(value = "bookName",alternate = {"Name","bn"})
    private String name;

    public Book(String id, String name) {
        this.id = id;
        this.name = name;

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 /**
     * json的序列化与反序列化
     * 使用toJson实现序列化,使用fromJson实现反序列化
     */
    private void jsonSeriaReSeria() {
        Gson gson = new Gson();
        Book book = new Book("1", "《深入Java虚拟机》");
        //将book类序列化成字符串
        String bookStr = gson.toJson(book);
        System.out.println(bookStr);
        //将bookStr反序列化成为Book类
        Book b = gson.fromJson(bookStr, Book.class);
        System.out.println(b.getName());
    }
**6.如何为属性做兼容性处理(重命名、预设名称等)**
 	/**
     * 如何给json属性重命名
     * 假设我们有这样一个需求:由于接口改版,从服务端返回的api中的book字段的name属性,变为了bookName。如果我们
     * 仍然用name进行解析,则接不到bookName的值,而由于服务端没有返回name,则解析后name=null。如果要考虑到兼容性那么我们的的Book类的属性就
     * 需要做一下兼容性的处理。
     * 使用@SerializedName可以给属性重命名。用@SerializedName的alternate属性给Book的属性做扩展
     */
    private void reNameProperty() {
        String bookJson = "{\"id\":\"1\",\"bookName\":\"《深入Java虚拟机》\"}";
        Gson gson = new Gson();
        Book book = gson.fromJson(bookJson, Book.class);
        System.out.println(book.getName());
    }

注:@SerializedName(value = “bookName”,alternate = {“Name”,“bn”})表示在反序列化时候可以使用bookName,Name,bn都可以被识别到,set到Book中的name属性;相应的在序列化的时候,name属性会被序列化为bookName字符串;

7.GsonBuilder的一些基础配置

/**
     * 对GsonBuilder一些属性介绍
     */
    private void gsonBuilderProperty() {
        Gson gson = new GsonBuilder()
                .serializeNulls()//默认情况下如果某一个属性为null,那么此属性不会参与序列化和反序列化的过程,加上此属性后会参与序列化和反序列化的过程
                .setPrettyPrinting()//格式化json字符串的输出,默认情况下是输出一行,经过这个属性设置后会格式化输出,即有缩进的输出
                .setDateFormat("yyyy-MM-dd HH:mm:ss")//对时间进行格式化
                .create();
    }

8.TypeAdapter使用方法介绍

/**
     * typeAdapter的使用方法
     * TypeAdapter是一个泛型抽象类,用于接管某种类型的序列化和反序列化的过程
     * 它包含两个抽象方法write和read,分别用于自定义的序列化和反序列化的过程
     */
    private void useTypeAdapter() {
        Gson gson = new GsonBuilder().registerTypeAdapter(Book.class,new BookTypeAdapter()).create();
        Book book = new Book("1","深入Java虚拟机");
        System.out.println(gson.toJson(book));

        String bookJson = "{\"Id\":\"1\",\"Name\":\"《深入Java虚拟机》\"}";
        Book book1 = gson.fromJson(bookJson,Book.class);
        System.out.println(gson.toJson(book1));
    }
  以下是BookTypeAdapter的代码介绍

package com.yw.gsonlib;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

/**
 * create by yangwei
 * on 2020-02-23 15:12
 */
public class BookTypeAdapter extends TypeAdapter<Book> {
    /**
     * 序列化接口
     *
     * @param jsonWriter
     * @param book
     * @throws IOException
     */
    @Override
    public void write(JsonWriter jsonWriter, Book book) throws IOException {
        //流式序列化对象开始
        jsonWriter.beginObject();
        //将Json的key值都指定为首字母大写
        jsonWriter.name("Id").value(book.getId());
        jsonWriter.name("Name").value(book.getName());
        //流式序列化对象结束
        jsonWriter.endObject();
    }

    /**
     * 反序列化接口
     *
     * @param jsonReader
     * @return
     * @throws IOException
     */
    @Override
    public Book read(JsonReader jsonReader) throws IOException {
        Book book = new Book();
        //流式反序列化开始
        jsonReader.beginObject();
        while (jsonReader.hasNext()) {
            switch (jsonReader.nextName()) {
                case "id":
                case "Id":
                    book.setId(jsonReader.nextString());
                    break;
                case "name":
                case "Name":
                    book.setName(jsonReader.nextString());
                    break;
            }
        }
        //流式反序列化结束
        jsonReader.endObject();
        return book;
    }
}

转载来源:https://www.cnblogs.com/tony-yang-flutter/p/12350156.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gson使用方法 的相关文章

随机推荐

  • Ubuntu更换国内镜像源

    由于Ubuntu官方镜像速度有限 xff0c 可以使用国内镜像加速更新和下载 xff0c 节约时间 常用的国内镜像有很多 xff0c 本人常用的有如下几个 xff0c 仅供参考 163镜像 mirrors 163 com 清华镜像 mirr
  • ubuntu-2204 gerrit ssh 报错Permission denied (publickey).分析及解决

    ubuntu 2204 gerrit ssh 报错Permission denied publickey 分析及解决 使用repo init sync下载代码时遇到报错 Permission denied publickey 分析排查步骤
  • 消息序列化工具-protobuf介绍及安装使用技巧

    简介 protobuf是google团队开发的用于高效存储和读取结构化数据的工具 xml json也可以用来存储此类结构化数据 xff0c 但是使用protobuf表示的数据能更加高效 xff0c 并且将数据压缩得更小 xff0c 大约是j
  • 消息序列化工具-为现代C++设计的jsoncpp介绍与使用技巧

    概述 JSON 的全称为 xff1a JavaScript Object Notation xff0c 顾名思义 xff0c JSON 是用于标记 Javascript 对象的 xff0c JSON 官方的解释为 xff1a JSON 是一
  • cppcheck代码检查工具安装与使用技巧

    cppcheck代码检查工具安装与使用技巧 Cppcheck 是一种 C C 43 43 代码缺陷静态检查工具 不同于 C C 43 43 编译器及很多其它分析工具 xff0c 它不检查代码中的语法错误 Cppcheck 可以检查非标准代码
  • sed流编辑器中使用变量替换以及执行外部命令

    在使用sed对日志或者其它文本进行parse的过程当中 xff0c 有时候我们需要引用外部变量的值 xff0c 或者获取一个shell命令执行的结果 xff0c 以便达到更加可观的输出结果 这里介绍如何做到 sed 流编辑 1 sed命令及
  • (计蒜客) 取石子游戏 (gcd算法灵活运用)

    蒜头君和花椰妹在玩一个游戏 xff0c 他们在地上将 n 颗石子排成一排 xff0c 编号为 1 到 n 开始时 xff0c 蒜头君随机取出了 2 颗石子扔掉 xff0c 假设蒜头君取出的 2 颗石子的编号为 a b 游戏规则如下 xff0
  • mkisofs命令制作iso文件

    mkisofs命令行格式 mkisofs adDfhJlLNrRTvz print size quiet A lt 应用程序ID gt b lt 开机映像文件 gt c lt 开机文件名称 gt hide lt 目录或文件名 gt hide
  • windows下tree命令列出文件目录树

    windows下tree命令列出文件目录树 tree path f tree D AR C Team f 可以将D AR C Team目录下所有目录及子目录下的文件都打印出来 tree D AR C Team f gt HOMEPATH f
  • yum命令安装历史回滚彻底删除安装的依赖包

    yum命令安装一个软件包是会连同依赖包一起安装 xff0c 但是yum remove卸载时却只卸载这个文件包本身 如果需要删除安装时附加的依赖包可以使用yum history的相关操作实现回滚 假如安装了ecliipse pde xff0c
  • latex在ipython jupyter notebook中的使用

    In 2 from IPython display import Latex In 5 数学公式的前后要加上 或 和 Latex r 34 f x 61 3x 43 7 34 Out 5 In 6
  • wsl 镜像迁移

    wsl 镜像迁移 1 打开CMD xff0c 查看所有WSL wsl l all v NAME STATE VERSION Ubuntu 20 04 Stopped 2 centos Running 2 2 导出WSL wsl export
  • Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建

    Note 开启模块支持 xff0c 设置国内高速代理 xff0c 参考 https www jianshu com p d782d70b3a25 简介 搭建的目的只是刚好看到有这么一个模块 xff0c 还有给使用Go的人需要用到调试界面的时
  • Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (二) UI继承

    简介 在UI A 中嵌套UI B UI B 是前面搭建的一个UI控件 创建 UI 文件 创建UI TextWidget ObjectName TextWidget 文件名保存为 textwidget ui 拖了一个QTextWidget到创
  • Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (三) 信号 和 槽

    简述 如下图所示 xff0c 每个控件的信号对应都有一个Connect函数 例如Clicked信号就有一个ConnectClicked 示例 基于 Golang中使用Qt库 therecipe qt 43 QtDesigner 43 Gol
  • linux工作中软件运行安装常见问题

    本文主要内容是使用linux软件安装 以及运行时常出现的一些问题 xff0c 主要如下 xff1a sudo apt get update Unable to fetch some archives问题 soure 的区别export LD
  • Ubuntu OpenCV VideoCapture无法获取到摄像头图像

    现在做摄像头捕获视频实验 xff0c 使用ViedeCapture xff0c 出现如下错误 xff1a WARN 0 global home xgl opencv 4 3 0 modules videoio src cap v4l cpp
  • 字符串排序-C语言

    二 字符串排序 题目描述 输入一个长度不超过20的字符串 xff0c 对所输入的字符串 xff0c 按照ASCII码的大小从小到大进行排序 xff0c 请输出排序后的结果 输入描述 一个字符串 xff0c 其长度n lt 61 20 输出描
  • Unable to locate package sysv-rc-conf

    报错如下 xff1a 解决办法 xff0c 如下 xff1a 第一步 xff1a 在root权限下操作 xff0c 软件源列表sources list xff08 该文本的位置在vim etc apt sources list xff09
  • Gson使用方法

    一 概述 Gson是google提供的用来操作json数据的一个非常好用的类库 其使用范围非常的广泛 xff0c 所以非常有必要对其进行系统的学习 json是一种数据格式 xff0c 确切的说是一种文本数据格式 其在网络通讯过程中的作用非常