Gson用法详解

来源:互联网 发布:香港买家淘宝怎么发货 编辑:程序博客网 时间:2024/06/05 21:59
1 基本用法 
   假设有对象pojo,如下: 
 
Java代码  收藏代码
  1. public class ModelObject {  
  2.   String name;  
  3.   int val;  
  4.   boolean status;  
  5.   double f;  
  6.     
  7.   public ModelObject(String name, int val,   
  8.   boolean status, double f) {  
  9.     super();  
  10.     this.name = name;  
  11.     this.val = val;  
  12.     this.status = status;  
  13.     this.f = f;  
  14.   }  
  15.     
  16.   @Override  
  17.   public String toString() {  
  18.     return "ModelObject [name=" + name + ",  
  19.     val=" + val + ", status="  
  20.     + status + ", f=" + f + "]";  
  21.   }  
Java代码  收藏代码
  1. public class ModelObject {  
  2.   String name;  
  3.   int val;  
  4.   boolean status;  
  5.   double f;  
  6.     
  7.   public ModelObject(String name, int val,   
  8.   boolean status, double f) {  
  9.     super();  
  10.     this.name = name;  
  11.     this.val = val;  
  12.     this.status = status;  
  13.     this.f = f;  
  14.   }  
  15.     
  16.   @Override  
  17.   public String toString() {  
  18.     return "ModelObject [name=" + name + ",  
  19.     val=" + val + ", status="  
  20.     + status + ", f=" + f + "]";  
  21.   }  

    然后是转换为JSON以及对JSON的反向转换: 
Java代码  收藏代码
  1. final Gson gson = new Gson();  
  2.   
  3. ModelObject modelObject = new ModelObject("myname"12true2.3);  
  4. System.out.println("toJson ---");  
  5. System.out.println("Original Java object : " + modelObject);  
  6.   
  7. String json = gson.toJson(modelObject);  
  8. System.out.println("Converted JSON string is : " + json);  
  9.    
  10. System.out.println("fromJson----");  
  11.   
  12. System.out.println("Original JSON string is : " + json);  
  13.   
  14. ModelObject modelObject1 = gson.fromJson(json, ModelObject.class);  
  15. System.out.println("Converted Java object : " + modelObject1);  
Java代码  收藏代码
  1. final Gson gson = new Gson();  
  2.   
  3. ModelObject modelObject = new ModelObject("myname"12true2.3);  
  4. System.out.println("toJson ---");  
  5. System.out.println("Original Java object : " + modelObject);  
  6.   
  7. String json = gson.toJson(modelObject);  
  8. System.out.println("Converted JSON string is : " + json);  
  9.    
  10. System.out.println("fromJson----");  
  11.   
  12. System.out.println("Original JSON string is : " + json);  
  13.   
  14. ModelObject modelObject1 = gson.fromJson(json, ModelObject.class);  
  15. System.out.println("Converted Java object : " + modelObject1);  


  输出: 
toJson --- 
Original Java object : ModelObject [name=myname, val=12, status=true, f=2.3] 
Converted JSON string is : {"name":"myname","val":12,"status":true,"f":2.3} 
fromJson---- 
Original JSON string is : {"name":"myname","val":12,"status":true,"f":2.3} 
Converted Java object : ModelObject [name=myname, val=12, status=true, f=2.3] 

2) 如果是对于泛型的 
  
  则要使用: 
  Type collectionType =new TypeToken<{ generic-object-with-type-information }>(){}.getType(); 
   
比如: 
  
Java代码  
  1. public class GenericModel<T> {  
  2.   T value;  
  3.     
  4.   public GenericModel(T value) {  
  5.     super();  
  6.     this.value = value;  
  7.   }  
  8.     
  9.   @Override  
  10.   public String toString() {  
  11.     return "Model2 [value=" + value + "]";  
  12.   }  
  13. }  
Java代码  
  1. public class GenericModel<T> {  
  2.   T value;  
  3.     
  4.   public GenericModel(T value) {  
  5.     super();  
  6.     this.value = value;  
  7.   }  
  8.     
  9.   @Override  
  10.   public String toString() {  
  11.     return "Model2 [value=" + value + "]";  
  12.   }  
  13. }  

  
  
  使用方法: 
 
Java代码  
  1. Gson gson = new Gson();  
  2.    
  3. System.out.println("A generic object demo");  
  4.   
  5. GenericModel<Integer> model = new GenericModel<>(12);  
  6.    
  7.   
  8. String json = gson.toJson(model);  
  9. System.out.println("json representation :" + json);  
  10.    
  11.   
  12. Type collectionType = new TypeToken<GenericModel<Integer>>() {  
  13. }.getType();  
  14. GenericModel<Integer> modelObj =   
  15.                   gson.fromJson(json, collectionType);  
  16. System.out.println("converted object representation: " + modelObj);  
  17.    
  18. System.out.println("\nA object from collection framework\n");  
  19.   
  20. List<String> listOfString = new ArrayList<>();  
  21. listOfString.add("ajduke");  
  22. listOfString.add("ajduchess");  
  23.    
  24.   
  25. String jsonStr = gson.toJson(listOfString);  
  26. System.out.println("json representation :" + jsonStr);  
  27.    
  28. Type collectionType2 = new TypeToken<List<String>>() {  
  29. }.getType();  
  30. List<String> listObj = gson.fromJson(jsonStr, collectionType2);  
  31. System.out.println("converted object representation: " + listObj);  
Java代码  
  1. Gson gson = new Gson();  
  2.    
  3. System.out.println("A generic object demo");  
  4.   
  5. GenericModel<Integer> model = new GenericModel<>(12);  
  6.    
  7.   
  8. String json = gson.toJson(model);  
  9. System.out.println("json representation :" + json);  
  10.    
  11.   
  12. Type collectionType = new TypeToken<GenericModel<Integer>>() {  
  13. }.getType();  
  14. GenericModel<Integer> modelObj =   
  15.                   gson.fromJson(json, collectionType);  
  16. System.out.println("converted object representation: " + modelObj);  
  17.    
  18. System.out.println("\nA object from collection framework\n");  
  19.   
  20. List<String> listOfString = new ArrayList<>();  
  21. listOfString.add("ajduke");  
  22. listOfString.add("ajduchess");  
  23.    
  24.   
  25. String jsonStr = gson.toJson(listOfString);  
  26. System.out.println("json representation :" + jsonStr);  
  27.    
  28. Type collectionType2 = new TypeToken<List<String>>() {  
  29. }.getType();  
  30. List<String> listObj = gson.fromJson(jsonStr, collectionType2);  
  31. System.out.println("converted object representation: " + listObj);  



3 如果不希望有某些属性,则使用transient屏蔽,如: 

    transient int val; 

4 介绍一下如何输出漂亮的json格式,因为默认的输出是compact格式,就是比如: 
  {"name":"ajduke","languagesKnown":["Java","Scala","Ruby"]} 

  可以使用如下的方式输出漂亮格式的: 
 
Java代码  
  1. GsonBuilder gsonBuilder = new GsonBuilder();  
  2. Gson prettyGson = gsonBuilder.setPrettyPrinting().create();  
  3. json = prettyGson.toJson(new Developer());  
Java代码  
  1. GsonBuilder gsonBuilder = new GsonBuilder();  
  2. Gson prettyGson = gsonBuilder.setPrettyPrinting().create();  
  3. json = prettyGson.toJson(new Developer());  

   就是setPrettyPrinting选项了,输出的格式为: 
   ******* Pretty formatting ********* 

  "name": "ajduke", 
  "languagesKnown": [ 
    "Java", 
    "Scala", 
    "Ruby" 
  ] 

  
5 把null值也转换,默认是不转换null值的,可以选择也转换,比如 
  
Java代码  
  1. class Developer {  
  2.    
  3.   private String name;  
  4.   private String classz;  
  5.   List<String> languagesKnown;  
  6.     
  7.   public Developer() {  
  8.     name = "ajduke";  
  9.    
  10.     languagesKnown = new ArrayList<>();  
  11.     languagesKnown.add("Java");  
  12.     languagesKnown.add("Scala");  
  13.     languagesKnown.add("Ruby");  
  14.   }  
  15. }  
Java代码  
  1. class Developer {  
  2.    
  3.   private String name;  
  4.   private String classz;  
  5.   List<String> languagesKnown;  
  6.     
  7.   public Developer() {  
  8.     name = "ajduke";  
  9.    
  10.     languagesKnown = new ArrayList<>();  
  11.     languagesKnown.add("Java");  
  12.     languagesKnown.add("Scala");  
  13.     languagesKnown.add("Ruby");  
  14.   }  
  15. }  

   则: 
Java代码  
  1. Gson gson = new Gson();  
  2.    
  3. System.out.println("Default behaviour ");  
  4. GsonBuilder gsonBuilder = new GsonBuilder();  
  5.    
  6. Gson prettyGson = gsonBuilder.setPrettyPrinting().create();  
  7. String json = prettyGson.toJson(new Developer());  
  8. System.out.println(json);  
  9.    
  10. System.out.println("Including the nulls ");  
  11. Gson includeNullsGson = gsonBuilder.serializeNulls().create();  
  12. String json2 = includeNullsGson.toJson(new Developer());  
  13. System.out.println(json2);  
Java代码  
  1. Gson gson = new Gson();  
  2.    
  3. System.out.println("Default behaviour ");  
  4. GsonBuilder gsonBuilder = new GsonBuilder();  
  5.    
  6. Gson prettyGson = gsonBuilder.setPrettyPrinting().create();  
  7. String json = prettyGson.toJson(new Developer());  
  8. System.out.println(json);  
  9.    
  10. System.out.println("Including the nulls ");  
  11. Gson includeNullsGson = gsonBuilder.serializeNulls().create();  
  12. String json2 = includeNullsGson.toJson(new Developer());  
  13. System.out.println(json2);  

  输出: 
Default behaviour 

  "name": "ajduke", 
  "languagesKnown": [ 
    "Java", 
    "Scala", 
    "Ruby" 
  ] 

Including the nulls 

  "name": "ajduke", 
  "classz": null, 
  "languagesKnown": [ 
    "Java", 
    "Scala", 
    "Ruby" 
  ] 


6 输出的json使用另外一个名字,默认转换出来的json中和对象的字段是一样的,当然也 
可以设置成不同,使用注解 
   @SerializedName("firstName") 
  private String name; 
则指定了别名 

7 可以输出到流 
  
Java代码  
  1. Gson gson = new Gson();  
  2.  System.out.println("Writing JSON to file ....");  
  3.   
  4.  try (FileWriter writer = new FileWriter("d:/output.json")) {   
  5.    gson.toJson(new Developer(), writer); // writing to file  
  6.  }  
  7.    
Java代码  
  1. Gson gson = new Gson();  
  2.  System.out.println("Writing JSON to file ....");  
  3.   
  4.  try (FileWriter writer = new FileWriter("d:/output.json")) {   
  5.    gson.toJson(new Developer(), writer); // writing to file  
  6.  }  
  7.    


8 使用@Since注解去维护版本,比如你有一个REST的API,并且有多个版本的JSON,如果下一个版本JSON中增加了字段,但又不希望所有的版本都在使用这些字段的话,就可以使用,比如: 
 
Java代码  
  1. public class Example33 {  
  2.   public static void main(String[] args) {  
  3.     Gson gson = new GsonBuilder().setVersion(2.0).create();  
  4.     String json = gson.toJson(new ExampleClass());  
  5.     System.out.println("Output for version 2.0...");  
  6.     System.out.println(json);  
  7.       
  8.     gson= new GsonBuilder().setVersion(1.0).create();  
  9.     json = gson.toJson(new ExampleClass());  
  10.     System.out.println("\nOutput for version 1.0...");  
  11.     System.out.println(json);  
  12.       
  13.     gson= new Gson();  
  14.     json = gson.toJson(new ExampleClass());  
  15.     System.out.println("\nOutput for No version set...");  
  16.     System.out.println(json);  
  17.   }  
  18. }  
  19.    
  20. class ExampleClass{  
  21.   String field=  "field";  
  22.   // this is in version 1.0  
  23.   @Since(1.0) String newField1 = "field 1";  
  24.   // following will be included in the version 1.1  
  25.   @Since(2.0) String newField2 = "field 2";  
  26. }  
Java代码  
  1. public class Example33 {  
  2.   public static void main(String[] args) {  
  3.     Gson gson = new GsonBuilder().setVersion(2.0).create();  
  4.     String json = gson.toJson(new ExampleClass());  
  5.     System.out.println("Output for version 2.0...");  
  6.     System.out.println(json);  
  7.       
  8.     gson= new GsonBuilder().setVersion(1.0).create();  
  9.     json = gson.toJson(new ExampleClass());  
  10.     System.out.println("\nOutput for version 1.0...");  
  11.     System.out.println(json);  
  12.       
  13.     gson= new Gson();  
  14.     json = gson.toJson(new ExampleClass());  
  15.     System.out.println("\nOutput for No version set...");  
  16.     System.out.println(json);  
  17.   }  
  18. }  
  19.    
  20. class ExampleClass{  
  21.   String field=  "field";  
  22.   // this is in version 1.0  
  23.   @Since(1.0) String newField1 = "field 1";  
  24.   // following will be included in the version 1.1  
  25.   @Since(2.0) String newField2 = "field 2";  
  26. }  


输出为: 
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"} 

9 HTML的转换 
   默认是GSON把HTML 转义的,但也可以设置不转义,比如: 
Java代码  
  1. public class Example34 {  
  2.   public static void main(String[] args) {  
  3.     String str ="<myval>";  
  4.     Gson gson = new Gson();  
  5.     System.out.println("Normal behaviour...");  
  6.     System.out.println(gson.toJson(str));  
  7.       
  8.     System.out.println("\nDisabled html escaping...");  
  9.     gson = new GsonBuilder().disableHtmlEscaping().create();  
  10.     System.out.println(gson.toJson(str));  
  11.   }  
  12. }  
Java代码  
  1. public class Example34 {  
  2.   public static void main(String[] args) {  
  3.     String str ="<myval>";  
  4.     Gson gson = new Gson();  
  5.     System.out.println("Normal behaviour...");  
  6.     System.out.println(gson.toJson(str));  
  7.       
  8.     System.out.println("\nDisabled html escaping...");  
  9.     gson = new GsonBuilder().disableHtmlEscaping().create();  
  10.     System.out.println(gson.toJson(str));  
  11.   }  
  12. }  

输出: 
  Normal behaviour... 
"\u003cmyval\u003e" 

Disabled html escaping... 
"<myval>" 


10 指定某些修饰符,比如private等不输出为json,比如: 
  GsonBuilder excludeFieldsWithModifiers = gsonBuilder 
    .excludeFieldsWithModifiers(Modifier.PRIVATE); 

Gson create = excludeFieldsWithModifiers.create(); 
String json2 = create.toJson(new Developer()); 

   当然也可以将要输出字段用@Expose去注解输出: 

11甚至可以指定将原来对象的字段,输出成什么样的JSON,比如全部转换为小写,并用空格或者下划线分隔 
  比如: 
 
Java代码  
  1. public static void main(String[] args) {  
  2.       
  3.     Gson gson = new Gson();  
  4.     String json = gson.toJson(new JsonClass());  
  5.     System.out.println("Default behaviour....");  
  6.     System.out.println(json);  
  7.       
  8.     gson = new GsonBuilder().setFieldNamingPolicy(  
  9.     FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();  
  10.     json = gson.toJson(new JsonClass());  
  11.     System.out.println("\nFields with lower case with dashes...");  
  12.     System.out.println(json);  
  13.       
  14.     gson = new GsonBuilder().setFieldNamingPolicy(  
  15.     FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES).create();  
  16.     json = gson.toJson(new JsonClass());  
  17.     System.out.println("\nFields with upper case with spaces...");  
  18.     System.out.println(json);  
  19.       
  20.   }  
  21. }  
  22.    
  23. class JsonClass {  
  24.   String myField = "value1";  
  25.   String myAnotherField = "value2";  
  26. }  
Java代码  
  1. public static void main(String[] args) {  
  2.       
  3.     Gson gson = new Gson();  
  4.     String json = gson.toJson(new JsonClass());  
  5.     System.out.println("Default behaviour....");  
  6.     System.out.println(json);  
  7.       
  8.     gson = new GsonBuilder().setFieldNamingPolicy(  
  9.     FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();  
  10.     json = gson.toJson(new JsonClass());  
  11.     System.out.println("\nFields with lower case with dashes...");  
  12.     System.out.println(json);  
  13.       
  14.     gson = new GsonBuilder().setFieldNamingPolicy(  
  15.     FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES).create();  
  16.     json = gson.toJson(new JsonClass());  
  17.     System.out.println("\nFields with upper case with spaces...");  
  18.     System.out.println(json);  
  19.       
  20.   }  
  21. }  
  22.    
  23. class JsonClass {  
  24.   String myField = "value1";  
  25.   String myAnotherField = "value2";  
  26. }  

  输出: 
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"}