更改名称映射的注解 @SerializedName

注解 @SerializedName

 /* 
 * Note that MyClass.b is now deserialized from either name1, name2 or name3.
 *
 * @see com.google.gson.FieldNamingPolicy
 *
 * @author Inderjeet Singh
 * @author Joel Leitch
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface SerializedName {

  /**
   * @return the desired name of the field when it is serialized or deserialized
   */
  String value();
  /**
   * @return the alternative names of the field when it is deserialized
   */
  String[] alternate() default {};
}

来看一个例子:

  public class UserSimple {     
      @SerializedName("name")   
      String name;    
      String email;  
      boolean isDeveloper;  
      int age;
  }

但是,假设有一刻 API 发生改变导致返回的 JSON 数据格式发生更改,接口返回了 "fullName" 而不是"name"。

{ 
    "age": 26,
    "email":  "[email protected]", 
    "fullName": "Norman", 
    "isDeveloper": true
}


不用担心,我们不要改动任何代码,我们只需要给类中改变的字段添加注解即可。

 public class UserSimple {     
      @SerializedName(value = "fullName", alternate="name") 
      String name;    
      String email;  
      boolean isDeveloper;  
      int age;
  }

然而,假设有一刻 API 发生改变导致返回的 JSON 数据格式发生更改,接口返回了 "nickName" 而不是"name"和"fullName"

 { 
    "age": 26,
    "email":  "[email protected]", 
    "fullName": "Norman", 
    "isDeveloper": true
}
{ 
    "age": 26,
    "email":  "[email protected]", 
    "name": "Norman", 
    "isDeveloper": true
}
{ 
    "age": 26,
    "email":  "[email protected]", 
    "nickName": "Norman", 
    "isDeveloper": true
}

我们只需要给类中改变的字段添加注解即可。

 public class UserSimple {     
      @SerializedName(value = "fullName", alternate={"name","nickName"}) 
      String name;    
      String email;  
      boolean isDeveloper;  
      int age;
  }

使用 Gson 进行注解,并在此运行,这就是是使用注解自动匹配的好处。

当然,你可以使用注解 @SerializedName 方式来保证命名规范,同时又可以正常映射接口字段,如果你的接口字段和命名规则差别很大,使用@SerializedName 注解来解决还是有必要的。

猜你喜欢

转载自blog.csdn.net/nuonuonuonuonuo/article/details/72910248