Gson Builder — 基础和命名规则

原文链接:Gson Builder — Basics & Naming Policies
原文出自:Norman Peitek
译者:無名無

在之前文章中,我们学习了使用 Gson 序列化和反序列化 Java 对象,到目前为止,我们总结了映射的过程。这篇文章开始我们将开始一个新的系列 GsonBuider,GsonBuider 用来自定义Gson。

 GsonBuider 基础

在之前的文章中,我们经常使用这样来生成一个 Gson 对象,Gson gson = new Gson();  这是标准的Gson生成方式,不过 Gson 提供了扩展,如果你有一些特殊的需求,你可以使用 GsonBuider 来自定义 Gson。

// previously
Gson gson = new Gson();

// now using GsonBuilder
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();

使用 GsonBuilder.create() 方法就可以创建一个 Gson 实例,有了它就可以解析各种数据类型了。

命名规则

首先要介绍下 GsonBuilder 中命名规则,我们一直认为 Java model 中字段名和 JSON 中字段名应该保持一致,但是我们可以通过 @SerializedName 来帮我们解决这种字段不一致的问题。

使用 @SerializedName 解决是一种方式,但是 Gson 也提供了一种自定义方式,使用 FieldNamingPolicy,我们根据例子来说明。

public class UserNaming {
   String Name;
   String email_of_developer;
   boolean isDeveloper;
   int _ageOfDeveloper;
}

可以看到,我们给不同类型的变量命名了不同的规则的字段名,这样做主要是为了之后自定义设置。

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.IDENTITY);
Gson gson = gsonBuilder.create();

先不用理解 FieldNamingPolicy.IDENTITY,这段代码的意思是,我们的 Gson 使用了 FieldNamingPolicy.IDENTITY 的自定义设置,接下来的几个例子我们将介绍 FieldNamingPolicy 中的其他属性。

 FieldNamingPolicy.IDENTITY

FieldNamingPolicy.IDENTITY 的作用是,完全匹配我们 Java model 中的字段名,不管你有没有设置其他注解属性,我们使用以下代码来生成一段 JSON 数据:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.IDENTITY);
Gson gson = gsonBuilder.create();

UserNaming user = new UserNaming("Norman", "norman@futurestud.io", true, 26);
String usersJson = gson.toJson(user);

输出:

{
    "Name": "Norman",
    "_ageOfDeveloper": 26,
    "email_of_developer": "norman@futurestud.io",
    "isDeveloper": true
}

可以看到字段名就是我们 model 中的字段名,没有发生改变,如果你使用默认生成实例或者不使用 GsonBuilder 自定义生成,最后都会得到相同的结果。

FieldNamingPolicy - LOWER_CASE_WITH_UNDERSCORES

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = gsonBuilder.create();

UserNaming user = new UserNaming("Norman", "norman@futurestud.io", true, 26);

String usersJson = gson.toJson(user);

使用 FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES 规则,将修改生成的 JSON 中的字段名,格式将全部变成小写,并且每个单词用“_” 分割,输出如下:

{
    "name": "Norman",
    "_age_of_developer": 26,
    "email_of_developer": "norman@futurestud.io",
    "is_developer": true
}

这个很容易理解,我们可以通过看源代码来发现:

LOWER_CASE_WITH_UNDERSCORES() {  
      public String translateName(Field f) {  
             return separateCamelCase(f.getName(), "_").toLowerCase();  
      }
}

 ## FieldNamingPolicy - LOWER_CASE_WITH_DASHES

有了上面的理解,这个就很好理解了,除了每个单词用“-” 分隔意外其他和
FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES 都一样

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);
Gson gson = gsonBuilder.create();

UserNaming user = new UserNaming("Norman", "norman@futurestud.io", true, 26);
String usersJson = gson.toJson(user);

输出:

{
    "name": "Norman",
    "_age-of-developer": 26,
    "email_of_developer": "norman@futurestud.io",
    "is-developer": true
}

FieldNamingPolicy - UPPER_CAMEL_CASE

这个就更简单了,规则是每个单词的第一个字母都要大写,其他不变

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
Gson gson = gsonBuilder.create();

UserNaming user = new UserNaming("Norman", "norman@futurestud.io", true, 26);
String usersJson = gson.toJson(user);

输出

 {
    "Name": "Norman",
    "_AgeOfDeveloper": 26,
    "Email_of_developer": "norman@futurestud.io",
     "IsDeveloper": true
}

看结果就可以发现,采用了驼峰命名规则,_AgeOfDeveloper 看起来比较特殊,但它是正确的命名方法。

FieldNamingPolicy - UPPER_CAMEL_CASE_WITH_SPACES

规则如下:

1、每个单词的第一个字母会大写
2、每个单词使用空格分隔

含有 “_” 的链接的不会在使用空格。

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES);
Gson gson = gsonBuilder.create();

UserNaming user = new UserNaming("Norman", "norman@futurestud.io", true, 26);
String usersJson = gson.toJson(user);

输出:

{
    "Name": "Norman",
    "_Age Of Developer": 26,
    "Email_of_developer": "norman@futurestud.io",
    "Is Developer": true
}

@SerializedName 混用

关于 @SerializedName 的用法,我们在之前的文章中已经介绍过了

public class UserNaming {
    String Name;

    @SerializedName("emailOfDeveloper")
    String email_of_developer;

    boolean isDeveloper;
    int _ageOfDeveloper;
}

看上面的例子,我们使用了 @SerializedName ,如果我们在使用 UPPER_CAMEL_CASE 规则,将会发生什么?

运行看下结果:

{
    "Name": "Norman",
    "_AgeOfDeveloper": 26,
    "emailOfDeveloper": "norman@futurestud.io",
    "IsDeveloper": true
}

你会发现出了 emailOfDeveloper 其他的字段每个单词的首字母都大写了,说明最后以 @SerializedName 为准。

自定义规则

@SerializedName 可能不能满足你的需求规则,我们将使用 GsonBuilder的 setFieldNamingStrategy 方法 ,FieldNamingStrategy 自定义规则。例如:

FieldNamingStrategy customPolicy = new FieldNamingStrategy() {
    @Override
        public String translateName(Field f) {
            return f.getName().replace("_", "");
      }
};

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingStrategy(customPolicy);
Gson gson = gsonBuilder.create();

UserNaming user = new UserNaming("Norman", "norman@futurestud.io", true, 26);
String usersJson = gson.toJson(user);

输出:

{
    "Name": "Norman",
    "ageOfDeveloper": 26,
    "emailOfDeveloper": "norman@futurestud.io",
    "isDeveloper": true
}

上面将会把 “_” 剔除,需要注意的是一次只能有一个规则,如果使用多个规则,将以最后一个为准。

反序列化

以上都是关于序列化的操作,统一以上的规则也使用于 JSON 的反序列化操作,如果你的服务器返回的 JSON 字段是以小写和下划线作为规则的话,就可以使用 LOWER_CASE_WITH_UNDERSCORES
规则来匹配字段名称。

例如:

{
    "reviewer_name": "Marcus"
}

可以这样定义 Java model 类:

public class PostReviewer {
      String reviewerName;//不用分隔线,采用驼峰命名
}

目标

了解 GsonBuilder 的基本使用,根据不同需求进行自定义 GsonBuilder 规则。

下一篇将继续介绍有关 GsonBuilder 的操作。

练习代码已上传 Github https://github.com/whiskeyfei/Gson-Review 可自行查看。

Gson 系列文章翻译回顾

1、Gson - Java-JSON 序列化和反序列化入门
2、Gson - 映射嵌套对象
3、Gson - Arrays 和 Lists 映射对象
4、Gson - Map 结构映射
5、Gson - Set 集合映射
6、Gson - 空值映射
7、Gson Model Annotations - 如何使用 @SerializedName 更改字段的命名
8、Gson Model Annotations - @SerializedName 匹配多个反序列化名称
9、Gson Builder - 基础和命名规则
10、Gson Builder - 序列化空值
11、Gson Builder - 忽略策略
12、Gson Builder - Gson Lenient 属性
13、Gson Builder - 特殊类型 Floats & Doubles
17、Gson Builder - 如何使用 @Expose 忽略字段
19、Gson Advanced - 映射枚举类型
20、Gson Advanced - 映射循环引用
21、Gson Advanced - 泛型
22、Gson Advanced - 简单自定义序列化 (Part 1)
24、Gson Advanced - 自定义反序列化基础
25、Gson Advanced - 自定义对象实例创建
26、Gson Advanced - 通过 @JsonAdapter 自定义(反)序列化过程
32、Practical Gson - 如何解析多态对象

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值