使用Gson进行JSON序列化处理

栏目: 服务器 · 发布时间: 6年前

内容简介:关于为什么突然会使用Java,实际上还是公司要将之前原先Python开发的Elasticsearch搜索集成到到项目中,而必须在国庆前给出1个版本。真心的说,进度很赶,对于一个平时不怎么写Java的Pythoner来说,花了1天的时间把对应的功能完成的70%,不得不说是1个奇迹。在Jest包中,有这么1个Gson的包,用于对JSON数据进行序列化处理。这里我们单独将其拿出来,稍微简单的介绍一下,以后遇到同样的问题的时候也不用慌。这里使用的gson版本为我们使用maven下载了对应的包后,首先进行如下的操作

关于为什么突然会使用Java,实际上还是公司要将之前原先 Python 开发的Elasticsearch搜索集成到到项目中,而必须在国庆前给出1个版本。真心的说,进度很赶,对于一个平时不怎么写 Java 的Pythoner来说,花了1天的时间把对应的功能完成的70%,不得不说是1个奇迹。

在Jest包中,有这么1个Gson的包,用于对JSON数据进行序列化处理。这里我们单独将其拿出来,稍微简单的介绍一下,以后遇到同样的问题的时候也不用慌。这里使用的gson版本为 2.8.0

我们使用maven下载了对应的包后,首先进行如下的操作:

import com.google.gson.*;

序列化

接着我们实例化Gson类,并调用其toJson方法对1个对象进行序列化处理:

import java.util.*;  

...  

public class demo {  
    public static void main(String[] args){  
        Gson json = new Gson();  
        HashMap<String,Object> map = new HashMap<>();  
        ArrayList<String> arr = new ArrayList<>();  
        arr.add("张三");  
        arr.add("李四");  
        map.put("person", arr);  
        String str = json.toJson(map);  
        System.out.println(str);  
    }  
}

其结果如下所示:

{"person":["张三","李四"]}

可以说是1个非常简单的例子。但是上面的方式,对于数值为null的情况会忽略掉对应的键名,如下所示:

HashMap<String,Object> map = new HashMap<>();  
ArrayList<String> arr = new ArrayList<>();  
arr.add("张三");  
arr.add("李四");  
map.put("person", arr);  
map.put("gender", null);  
String str = json.toJson(map);

其结果为:

{"person":["张三","李四"]}

此时我们可以使用如下的方式进行序列化:

GsonBuilder json = new GsonBuilder();  
String str = json.serializeNulls().create().toJson(map);

另外,默认的序列化是没有美化效果的,看起来不是很方便,此时我们可以添加 setPrettyPrinting 方法来设置其为美化的输出:

String str = json.serializeNulls().setPrettyPrinting().create().toJson(map);

相应的结果立即就变成了:

{  
  "gender": null,  
  "person": [  
    "张三",  
    "李四"  
  ]  
}

除此之外,我们还可以对类进行实例化,比如我们有如下1个简单的类:

class Person {  
    private String name = "张三";  
    private int age = 23;  
    private String gender = "男";  

    @Override  
    public String toString(){  
        return name + ":" + age + ":" + gender;  
    }  
}

接着我们再进行实例化处理:

Person person = new Person();  
String str = json.toJson(person);  
System.out.println(str);

其结果为:

{"name":"张三","age":23,"gender":"男"}

可以看到,对应类的属性都被实例化了。另外,在这里我们对类的toString进行了重载,也是1种序列化的方式。

另1个比较有意思的地方,可能就是使用注解的方式来进行序列化处理了,例如:

import com.google.gson.annotations.*;  

class Person {  
    @SerializedName("username")  
    @Expose(serialize = true)  
    private String name = "张三";  
    private int age = 23;  
    @Expose(serialize = true)  
    private String gender = "男";  
}  

...  
Person person = new Person();  
String str2 = json.serializeNulls().excludeFieldsWithoutExposeAnnotation().create().toJson(person);  
System.out.println(str2);

在这里我们只序列化name和gender这个2个属性,其中属性name序列化时候的名称为username,之后我们调用GsonBuilder进行处理可以得到:

{"username":"张三","gender":"男"}

反序列化

而对于反序列化处理,我们只需要使用 fromJson 函数即可,例如我们可以对之前的JSON数据进行反序列化处理:

Person info = json.create().fromJson(str2, Person.class);  
System.out.println(info);

由于我们之前重载了对应类的toString方法,因此其结果为:

张三:23:男

另1个就是对之前新建的HashMap进行反序列化处理:

HashMap<?, ?> dict = json.create().fromJson(str, HashMap.class);  
System.out.println(dict);

其结果为:

{gender=null, person=[张三, 李四]}

通过反序列化,在调用Jest时对于返回的数据,我们就可以进行筛选,去除一些不需要的内容再序列化返回到前端。

而Gson还有一些其他的内容,比如对指定类型的序列化处理,这里就不叙述了,可以 参考


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

有限与无限的游戏

有限与无限的游戏

[美]詹姆斯·卡斯 / 马小悟、余倩 / 电子工业出版社 / 2013-10 / 35.00元

在这本书中,詹姆斯·卡斯向我们展示了世界上两种类型的「游戏」:「有限的游戏」和「无限的游戏」。 有限的游戏,其目的在于赢得胜利;无限的游戏,却旨在让游戏永远进行下去。有限的游戏在边界内玩,无限的游戏玩的就是边界。有限的游戏具有一个确定的开始和结束,拥有特定的赢家,规则的存在就是为了保证游戏会结束。无限的游戏既没有确定的开始和结束,也没有赢家,它的目的在于将更多的人带入到游戏本身中来,从而延续......一起来看看 《有限与无限的游戏》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码