使用Google GSON:额外的赠品:第二部分

如果您错过了系列的第一篇文章 ,我们将继续上一篇文章的“使用GSON ” ,这里是link 。 因此,这里我们进行另一系列的讨论。

版本支持

如果要维护一个对象的多个版本以进行JSON转换,则Google GSON库具有不错的@Since注释。 该注释可以应用于字段和类。

例如,假设您正在维护REST API的多个版本,并且使用JSON作为最终响应负载。 在API的下一个迭代中,将为特定的JSON实体添加一些字段,并且您不想将新添加的字段发送到以前的API版本,那么@Since注释就会出现。 让我们在下面的清单中看到我们如何使用此功能。

要使用此注释,您必须使用GsonBuilder将Gson实例配置为特定版本。

public class Example33 {public static void main(String[] args) {Gson gson = new GsonBuilder().setVersion(2.0).create();String json = gson.toJson(new ExampleClass());System.out.println("Output for version 2.0...");System.out.println(json);gson= new GsonBuilder().setVersion(1.0).create();json = gson.toJson(new ExampleClass());System.out.println("\nOutput for version 1.0...");System.out.println(json);gson= new Gson();json = gson.toJson(new ExampleClass());System.out.println("\nOutput for No version set...");System.out.println(json);}
}class ExampleClass{String field=  "field";// this is in version 1.0@Since(1.0) String newField1 = "field 1";// following will be included in the version 1.1@Since(2.0) String newField2 = "field 2";
}

上面的输出为:

Output for version 2.0...
{"field":"field","newField1":"field 1","newField2":"field 2"}Output for version 1.0...
{"field":"field","newField1":"field 1"}Output for No version set...
{"field":"field","newField1":"field 1","newField2":"field 2"}

如果您未指定任何版本,则无论其版本如何,它将包括所有字段。

禁用HTML转义

默认情况下,在转换过程中,所有包含的html字符都将转换为它们对应的Unicode,即<到\ u003c, >到\ u003e, 到\ u0026,依此类推。

要按原样传递html字符,您需要将gson实例配置为使用GsonBuilder#disableHtmlEscaping()方法。

以下清单显示了用法:

public class Example34 {public static void main(String[] args) {String str ="<myval>";Gson gson = new Gson();System.out.println("Normal behaviour...");System.out.println(gson.toJson(str));System.out.println("\nDisabled html escaping...");gson = new GsonBuilder().disableHtmlEscaping().create();System.out.println(gson.toJson(str));}
}

输出如下:

Normal behaviour...
"\u003cmyval\u003e"Disabled html escaping...
"<myval>"

从Json Output中排除字段

为此,Google GSON有4种处理方式,

  1. 具有瞬态和静态修饰符的字段
  2. 排除具有特定修饰符的字段
  3. 使用公开注释
  4. 用户定义的排除策略

让我们详细了解每个:

  1. 具有瞬态和静态修饰符的字段

    这是默认行为,在其中使用瞬态修饰符修改字段时将不包含该字段,正如我们在系列文章的第一篇文章中所看到的那样,当然,具有静态修饰符的字段也将被排除,因为它们是类的一部分,而不是实例的一部分。

  2. 排除具有特定修饰符的字段

    您可以配置gson实例,以便它将排除具有指定修饰符的字段,例如,您可以排除/忽略具有保护修饰符或私有修饰符的字段。

    要利用此功能,您需要使用GsonBuilder#excludeFieldsWithModifiers() ,如以下一系列清单所示。

    class Developer {private String name;private String classz;List<String> languagesKnown;public Developer() {name = "ajduke";classz= "Developer";languagesKnown = new ArrayList<>();languagesKnown.add("Java");languagesKnown.add("Scala");languagesKnown.add("Ruby");}
    }

    对于此示例,我们不包括私有字段。 尽管您可以使用任何修饰符(适用于字段的任何修饰符)排除字段

    Gson gson = new Gson();System.out.println("Default behaviour ");
    GsonBuilder gsonBuilder = new GsonBuilder();
    Gson prettyGson = gsonBuilder.setPrettyPrinting().create();
    String json = prettyGson.toJson(new Developer());
    System.out.println(json);System.out.println("Ignoring/excluding fields ");GsonBuilder excludeFieldsWithModifiers = gsonBuilder.excludeFieldsWithModifiers(Modifier.PRIVATE);Gson create = excludeFieldsWithModifiers.create();
    String json2 = create.toJson(new Developer());
    System.out.println(json2);

    在以下输出中,您可以看到按照我们的程序排除了私有字段,尽管您可以忽略可以进行保护,同步等操作的字段。

    Default behaviour 
    {"name": "ajduke","classz": "Developer","languagesKnown": ["Java","Scala","Ruby"]
    }Ignoring/excluding fields 
    {"languagesKnown": ["Java","Scala","Ruby"]
    }
  3. 使用公开注释

    Gson还提供了一个注释,您可以为这些字段进行标记,因此这些字段将从序列化输出中排除。

    为了使用这个,我们需要遵循以下两个

    1. 如下配置gson实例
      Gson gson = GsonBuilder()。excludeFieldsWithoutExposeAnnotation()。create()
    2. 并使用@Expose批注标记字段,这些批注将包含在最终的json输出中。 因此,未标记的将被排除

    以下清单显示了详细用法

    class Developer {// this field will be included@Exposeprivate String name;private  String classz;List<String> languagesKnown;public Developer() {name = "ajduke";languagesKnown = new ArrayList<>();languagesKnown.add("Java");languagesKnown.add("Scala");languagesKnown.add("Ruby");}
    }
    public class GsonEx {public static void main(String[] args) throws IOException {Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();String json = gson.toJson(new Developer());System.out.println(json);}
    }

    输出如下:

    {"name":"ajduke"}
  4. 用户定义的排除策略

    Google Gson库根据字段类型和字段属性提供非常细致的字段排除。

    为此,您需要通过实现接口的两个方法(如shouldSkipClass()ShouldSkipField())来实现ExclusionStrategy接口。 前者可以实现为将基于其类型跳过字段,而后可以基于字段属性(例如其修饰符,其注释等)实现

    现在,在实现ExclusionStrategy接口之后,您需要将其传递给GsonBuilder#setExclusionStrategies()方法以配置gson实例。

    以下是使用排除策略的最低限度实现,其中我们排除类型为String,List的字段以及具有注释为Deprecated的字段

    请注意ExclusionStrategy的以下实现

    class ExclusionStrategyImpl implements ExclusionStrategy {private final Class<?> classTypeToSkip;public ExclusionStrategyImpl(Class<?> classTypeToSkip) {this.classTypeToSkip = classTypeToSkip;}@Overridepublic boolean shouldSkipClass(Class<?> claz) {return classTypeToSkip == claz;}@Overridepublic boolean shouldSkipField(FieldAttributes fa) {return fa.getAnnotation(Deprecated.class) !=null;}
    }

    我们的自定义Developer类用于显示示例:

    class Developer {@Deprecatedprivate int count = 45;private String name;private  String classz;List<String> languagesKnown;public Developer() {name = "ajduke";classz = Developer.class.getCanonicalName();languagesKnown = new ArrayList<>();languagesKnown.add("Java");languagesKnown.add("Scala");languagesKnown.add("Ruby");}
    }
    public class Ex35 {public static void main(String[] args) {Gson gson = null;Developer developer = new Developer();String json = null;gson = new Gson();json = gson.toJson(developer);System.out.println("Default behaviuor....");System.out.println(json);// exclude field having Stringgson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategyImpl(List.class)).create();json = gson.toJson(developer);System.out.println("\nExclude fields with type - List");System.out.println(json);// exclude field having List gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategyImpl(String.class)).create();json = gson.toJson(developer);System.out.println("\nExclude fields with type - String");System.out.println(json);}
    }

    上面的输出如下:

    Default behaviuor....
    {"count":45,"name":"ajduke","classz":"in.ajduke.ap013.Developer","languagesKnown":["Java","Scala","Ruby"]}Exclude fields with type - List
    {"name":"ajduke","classz":"in.ajduke.ap013.Developer"}Exclude fields with type - String
    {"languagesKnown":[null,null,null]}

使用字段命名策略的自定义字段命名

正如我们在上一篇文章中看到的,Gson默认包含与类字段名称相同的输出json字段名称,我们也可以使用批注@serilizedName覆盖它。

在Gson中,我们还可以定义json字段名称以更改为大写,小写等,而无需使用任何注释。

为此,您需要使用GsonBuilder()。setFieldNamingPolicy()方法并传递适当的FieldNamePolicy

以下清单显示了用法:

package in.ajduke.ap013;import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;public class Example34 {public static void main(String[] args) {Gson gson = new Gson();String json = gson.toJson(new JsonClass());System.out.println("Default behaviour....");System.out.println(json);gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();json = gson.toJson(new JsonClass());System.out.println("\nFields with lower case with dashes...");System.out.println(json);gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES).create();json = gson.toJson(new JsonClass());System.out.println("\nFields with upper case with spaces...");System.out.println(json);}
}class JsonClass {String myField = "value1";String myAnotherField = "value2";
}
Default behaviour....
{"myField":"value1","myAnotherField":"value2"}Fields with lower case and dashes...
{"my-field":"value1","my-another-field":"value2"}Fields with lower case and dashes...
{"My Field":"value1","My Another Field":"value2"}

参考: 使用Google GSON:额外的东西:来自我们的JCG合作伙伴 Abhijeet Sutar的 第二部分,来自ajduke的博客博客。

翻译自: https://www.javacodegeeks.com/2014/01/using-google-gson-extra-goodies-part-ii.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python开发【第2节】【Python运算符】

Python语言支持以下类型的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级1、算术运算符 假设变量a 10&#xff0c;变量b 21&#xff1a; 运算符描述实例加 - 两个对象相加a b 输出结果 31-减 - 得…

mybatis-plus分页查询_SpringBoot + MyBatisPlus 快速入门

Hello,大家好&#xff01;前面与大家分享了一次如何搭建Java项目脚手架&#xff0c;并且送给大家一个基础项目模板。那今天与大家分享如何使用这个基础项目&#xff0c;也就是快速上手 SpringBoots ➕ MyBatisPlus。 项目 / 目录结构 天津商业大学学院信息 这是一张天津商业大学…

php 获取每年的节假日,shell获取每年农历节日的日期

原创内容&#xff0c;转载请注明出处&#xff1a;https://www.myzhenai.com.cn/post/3711.html我打算自己写一个每年节日就自动在网站上展示灯笼的源码功能&#xff0c;但是这里最重要的是要获得每年春节、端午节、中秋节等节日的日期&#xff0c;因为要自己写这判断这些日期的…

AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制

思路&#xff1a;通过命令行修改浏览器启动参数&#xff0c;使得浏览器不进行跨域检查&#xff0c;从而允许跨域 方法&#xff1a;命令行参数启动浏览器后添加参数--disable-web-security 例&#xff1a;chrome --disable-web-security --disabl-web-security参数的作用是禁…

Android Studio 管理所有程序退出

import android.app.Activity; import java.util.ArrayList; import java.util.List;public class fa {public static List<Activity> activitieanew ArrayList<>();public static void add(Activity act){activitiea.add(act);//在创建活动是加入}public static v…

项目学生:Web服务集成

这是Project Student的一部分。 其他职位包括带有Jersey的 Web服务 客户端&#xff0c;带有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 具有Spring数据的持久性和分片集成测试数据 。 早些时候&#xff0c;我们成功地针对持久性/业务层&#xff08;使用嵌入式H…

python爬虫requests实战_Python爬虫之requests库网络爬取简单实战

实例1&#xff1a;直接爬取网页 实例2 &#xff1a; 构造headers&#xff0c;突破访问限制&#xff0c;模拟浏览器爬取网页 实例3 &#xff1a; 分析请求参数&#xff0c;构造请求参数爬取所需网页 实例4&#xff1a; 爬取图片 实例5&#xff1a; 分析请求参数&#xff0c;构造…

某制冷设备制造厂商

某制冷设备制造厂商 该公司是一家以钣金加工&#xff0c;制冷设备制造、销售为主的公司&#xff0c;其产品广泛应用于高级宾馆、饭店及大型餐饮设施等。销售网点遍及日本、北美、欧洲及东南亚&#xff0c;产品深受世界各地用户的欢迎。 该公司原先使用的是TPICS生产管理系统&am…

原生JS实现的DOM操作笔记(草稿整理)

原生JS实现的DOM一系列操作参考&#xff1a; 原生JavaScript封装DOM库siblings: 原生JS-查找相邻的元素-siblings方法的实现addClass,removeClass,hasClass,toggleClass&#xff1a;原生js添加删除class原生js添加删除class 代码如下&#xff1a; var dom {/** 功能说明&…

简单的Gradle Java插件自定义

正如我在“ 用Gradle构建Java的初步了解”一文中所展示的那样&#xff0c;当人们使用Java插件并将文件和目录放置在该插件期望的位置时&#xff0c; Gradle尤其适用于构建Java应用程序的基础知识&#xff08;惯例-基于项目的布局 &#xff09;。 但是&#xff0c;并非总是有一种…

k8s 重点

这几个月参与了几场面试&#xff0c;设计了多道面试题&#xff0c;觉得可以综合考察应聘人对 kubernetes的掌握情况。在这里分享下&#xff0c;供应聘人自查以及其他面试官参考。 这些面试题的设计初衷并不是考察 kubernetes 的使用。这种笔者认为较为流于表面&#xff0c;因为…

python中print的用法_python中print用法

print用法 参考文档&#xff1a; https://blog.csdn.net/sinat_28576553/article/details/81154912 目录 一、print()函数概述 二、变量的输出 三、数据的格式化输出 3.1 %字符 3.2 最小字段宽度和精度 3.3 转换标志 3.4 格式字符归纳 四、换行与防止换行 一、print()函数概述 …

java 播放.pcm文件,java播发PCM文件

java播放PCM文件import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioSystem;import javax.sound.sa…

02 re模块

# re的工作是在python中执行正则表达式 import re# # find # result re.findall("\d", "baby的电话号是: 185123456789") # print(result) # # it re.finditer("\d", "baby123456789的电话号是: 185123456789") # for el in it: # …

网页中二维码识别规则

识别规则 这里采用的逻辑是截屏识别&#xff0c;当客户端发现用户在网页的img标签内进行长按操作时&#xff0c;会立刻截屏并且启动二维码识别算法。所以这里用于二维码识别的图片是截屏&#xff0c;而不是之前有人提到的img标签中的图片。 为什么要用截屏&#xff0c;这也是…

使用Mockito测试Spring组件

我认为&#xff0c;能够对弹簧组件进行单元测试而无需使用临时测试配置加载完整的弹簧上下文&#xff0c;这是一个很大的优势&#xff0c;因为它干净&#xff0c;易于维护&#xff0c;编写速度更快&#xff0c;更改平滑。 实现此目标的一种方法是使用Mockito并告诉他用Mocks &…

python数字转换_Python实现中文数字转换为阿拉伯数字的方法示例

本文实例讲述了Python实现中文数字转换为阿拉伯数字的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 一、需求 今天写了三千二百行代码。 今天写了3200行代码。 两行意思相同&#xff0c;只是表达方式不太能够&#xff0c;统一掉。 二、原理 数字的特征是 数字 …

LeetCode第14题:最长公共前缀

题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar"…

臭名昭著的sun.misc.Unsafe解释

Java虚拟机的最大竞争对手可能是托管C&#xff03;等语言的Microsoft CLR 。 CLR允许编写不安全的代码作为低级编程的入口&#xff0c;这在JVM上很难实现。 如果您需要Java中的此类高级功能&#xff0c;则可能会被迫使用JNI &#xff0c;这需要您了解一些C并Swift导致代码紧密耦…

主从复制

五 主从复制 Replication(重要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;) 5.1、介绍 基于主库二进制日志实时恢复到备库。 5.2、原理 5.2.1 主从复制的前提 &#xff08;1&#xff09;两台或两台以上数据库实例 &#xff08;2&#xff09;主库…