如果您错过了系列的第一篇文章 ,我们将继续上一篇文章的“使用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种处理方式,
- 具有瞬态和静态修饰符的字段
- 排除具有特定修饰符的字段
- 使用公开注释
- 用户定义的排除策略
让我们详细了解每个:
- 具有瞬态和静态修饰符的字段
这是默认行为,在其中使用瞬态修饰符修改字段时将不包含该字段,正如我们在系列文章的第一篇文章中所看到的那样,当然,具有静态修饰符的字段也将被排除,因为它们是类的一部分,而不是实例的一部分。
- 排除具有特定修饰符的字段
您可以配置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"] }
- 使用公开注释
Gson还提供了一个注释,您可以为这些字段进行标记,因此这些字段将从序列化输出中排除。
为了使用这个,我们需要遵循以下两个
- 如下配置gson实例
Gson gson = GsonBuilder()。excludeFieldsWithoutExposeAnnotation()。create() - 并使用@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"}
- 如下配置gson实例
- 用户定义的排除策略
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"}
翻译自: https://www.javacodegeeks.com/2014/01/using-google-gson-extra-goodies-part-ii.html