1. 程式人生 > >google的@SerializedName和@Expose註解

google的@SerializedName和@Expose註解

google的@SerializedName和@Expose註解

2015年02月03日 15:09:45 閱讀數:387

註解了@SerializedName的欄位會被序列化到JSON中,輸出的JSON格式中的名字即為註解時給定的名字。

Java程式碼 複製程式碼

  1. public class SomeClassWithFields {   
  2.    @SerializedName("name") private final String someField;   
  3.    private final String someOtherField;   
  4.   
  5.    public SomeClassWithFields(String a, String b) {   
  6.      this.someField = a;   
  7.      this.someOtherField = b;   
  8.    }   
  9.  }  

[java] view plain copy

  1. public class SomeClassWithFields {  
  2.    @SerializedName("name") private final String someField;  
  3.    private final String someOtherField;  
  4.   
  5.    public SomeClassWithFields(String a, String b) {  
  6.      this.someField = a;  
  7.      this.someOtherField = b;  
  8.    }  
  9.  }  

Java程式碼 複製程式碼

  1. SomeClassWithFields objectToSerialize = new SomeClassWithFields("a", "b");   
  2.  Gson gson = new Gson();   
  3.  String jsonRepresentation = gson.toJson(objectToSerialize);   
  4.  System.out.println(jsonRepresentation);   
  5.   
  6.  ===== OUTPUT =====   
  7.  {"name":"a","someOtherField":"b"}  

[java] view plain copy

  1. SomeClassWithFields objectToSerialize = new SomeClassWithFields("a", "b");  
  2.  Gson gson = new Gson();  
  3.  String jsonRepresentation = gson.toJson(objectToSerialize);  
  4.  System.out.println(jsonRepresentation);  
  5.   
  6.  ===== OUTPUT =====  
  7.  {"name":"a","someOtherField":"b"}  

上面是google API的例子。這個註解可以用在需要以JSON格式輸出pojo類資訊的情況。

同樣@Expose註解的意思是:An annotation that indicates this member should be exposed for JSON serialization or deserialization。這時google API上的一些話:

 

This annotation has no effect unless you build com.google.gson.Gson with a com.google.gson.GsonBuilder and invoke com.google.gson.GsonBuilder.excludeFieldsWithoutExposeAnnotation() method.

Here is an example of how this annotation is meant to be used:

 

 public class User {
   @Expose private String firstName;
   @Expose private String lastName;
   @Expose private String emailAddress;
   private String password;
 }
 

If you created Gson with new Gson(), the toJson() and fromJson() methods will use the password field along-with firstName, lastName, and emailAddress for serialization and deserialization. However, if you created Gson with Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() then the toJson() and fromJson() methods of Gson will exclude the password field. This is because the password field is not marked with the @Expose annotation.

Note that another way to achieve the same effect would have been to just mark the password field as transient, and Gson would have excluded it even with default settings. The @Expose annotation is useful in a style of programming where you want to explicitly specify all fields that should get considered for serialization or deserialization.