注解在Gson中的应用

今天在套接口,后台返回的是数组,我用Gson.fromJson()进行解析

public static <T> List<T> stringToArray(String s, Class<T[]> clazz) {
        T[] arr = new Gson().fromJson(s, clazz);
        return Arrays.asList(arr);
    }

原本以为so easy,接口调通后,NM


QQ图片20170607204757.png

实体类中参数想写成“0”,咋办?本来想让后台改改,最后注解解决了问题。()

  @SerializedName("2")
    private String aa ;通过注解,“2”的赋值就到了aa属性上
                                同理,如果实体类转换成json字符串时,aa生成“2”
     这样就解决了Java对象中的属性名和json字段名不匹配的问题了

该快去补补注解的知识,哈哈
在Gosn中的ReflectiveTypeAdapterFactory找到这个方法


  /** first element holds the default name */
  static List<String> getFieldName(FieldNamingStrategy fieldNamingPolicy, Field f) {
    SerializedName serializedName = f.getAnnotation(SerializedName.class);
    List<String> fieldNames = new LinkedList<String>();
    if (serializedName == null) {
    //平时不加注解时,返回这个
      fieldNames.add(fieldNamingPolicy.translateName(f));
            } else {
    //当注解不为null时,取到注解的value
      fieldNames.add(serializedName.value());
      for (String alternate : serializedName.alternate()) {
        fieldNames.add(alternate);
      }
    }
    return fieldNames;
  }

再看看SerializedName注解类的源码

@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 {};

当我们的Java对象这样写的时候

@SerializedName("XXX")
private String name;
这样在解析的时候就能转换成注解标示的字段名,我们取值可以getName();
例如返回图片的url,为了好理解我们写成String imgUrl,不用管后台接口返回什么值了("url",不形象,换掉)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容