乐趣区

Gson简明处理

原文地址:http://blog.52sox.com/use-gso…

关于为什么突然会使用 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 还有一些其他的内容, 比如对指定类型的序列化处理, 这里就不叙述了, 可以参考。
参考文章:

http://www.javadoc.io/doc/com…https://www.cnblogs.com/mafly…https://www.cnblogs.com/majay…

退出移动版