如果您错过了系列的第一篇文章 ,我们将继续上一篇文章的“使用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

使用Google GSON:额外的赠品:第二部分相关推荐

  1. 使用Google GSON:额外的赠品:第一部分

    介绍 这是以前的Google GSON入门的后续文章,其中显示了有关使用Google Gson的入门资料. 本文显示了GSON库的一些其他优点. 由于有很多关于这些额外功能的文章要写,所以我将长篇文章 ...

  2. Google GSON入门

    在Java世界中,JSON已成为事实上的XML数据交换格式标准,因为它的易用性和传输效率高. 如果您不了解JSON,那就是Javascript对象表示法,这是一种基于文本的数据交换格式,是名称-值的集 ...

  3. Google Gson的使用方法及JSON 技术对比

    为什么80%的码农都做不了架构师?>>>    一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib ...

  4. com.google.gson.Gson 使用详解

    import com.google.gson.Gson出错,标红 这个主要是缺少jar包,搜索这个jar包添加到Libs里面就可以了 下载地址:https://mvnrepository.com/ar ...

  5. Google Gson 使用简介

    原文:http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html 一.如何将数组转化为 json 串? 下面的例子中我们示例如何将一个数 ...

  6. com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGI

    报错如下: 2020-03-05 18:41:55.161 5576-5576/com.xiayiye.takeout W/System.err: com.google.gson.JsonSyntax ...

  7. Android之奔溃提示com.google.gson.internal.LinkedTreeMap cannot be cast to java.util.HashMap

    1 问题 Android端获取服务端的数据然后我直接把数据转hashMap提示错误如下, com.google.gson.internal.LinkedTreeMap cannot be cast t ...

  8. java 解析gson_使用Java和Google GSON解析ESPN API

    java 解析gson 在我的第一篇文章中,我将解释如何解析ESPN API. 可以在http://developer.espn.com/docs上找到API文档. 首先,您需要请求一个API密钥,然 ...

  9. 使用Java和Google GSON解析ESPN API

    在我的第一篇文章中,我将解释如何解析ESPN API. 可以在http://developer.espn.com/docs上找到API文档. 首先,您需要请求一个API密钥,然后可以开始查询REST ...

最新文章

  1. LDO和DC-DC的区别
  2. oracle 存储过程 输入,Oracle 存储过程加密方法
  3. VMWare 黑苹果卡在Logo页面
  4. linux-文件的类型
  5. HttpClient简单请求和返回样例
  6. 移动端 js 弹出层内容滚动的时候,不影响body的滚动条处理
  7. 目前看的GNN论文的一些总结
  8. os.path.join;os.makedirs()
  9. hive实现两列数据合并成一列
  10. 求循环小数的循环节C/C++
  11. 【PHP兴趣部落-08】PHP中时区设置的三种方法(timezone)
  12. 全国高校中文档--json
  13. Typora的崩溃导致文件丢失
  14. 【Linux】centos解压缩rar
  15. MapGuide的系统架构
  16. excel求方差和标准差的函数_Excel标准差计算函数Stdev和StdevP的用法与区别,包含4个实例...
  17. 延迟满足 —— 达到目标需要忍住重重诱惑
  18. Web测试方法与技术之CSS讲解
  19. 小型仓库管理系统MySQL
  20. 爱莫科技加入中国ECR委员会助力FMCG产业更好更快发展

热门文章

  1. 数据库主从和主备部署介绍
  2. redis nosql_NoSql数据库:Cassandra,Mongo,Redis数据库比较
  3. groovy lambda_Java Lambda流和Groovy Clouse的比较
  4. 文档在线签名_为什么需要为文档和合同切换到在线签名
  5. ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式
  6. java gc cms_Java垃圾收集器:G1GC何时将CMS强制退出?
  7. 工程模式和抽象工厂模式_功能工厂模式
  8. javafx属性_JavaFX技巧11:更新只读属性
  9. Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试
  10. java8 streams_使用Java 8 Streams进行编程对算法性能的影响