假设我想要的JSON是{"grrrr":"zzzzz"}

class MyClass{
    @SerializedName("grrrr")
    private String myString;
}


上课很好。

然而:

class MyClass{
    @MyAnnotation("grrrr")
    private String myString;
}


这将产生{"myString":"zzzzz"}

如何使Gson识别MyAnnotation#value()并将其处理为SerializedName#value()

最佳答案

为了使Gson能够识别自制注释,请实现自定义FieldNamingStrategy

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface MyAnnotation {
    String value();
}


class MyNamingStrategy implements FieldNamingStrategy {
    @Override
    public String translateName(Field f) {
        MyAnnotation annotation = f.getAnnotation(MyAnnotation.class);
        if (annotation != null)
            return annotation.value();
        // Use a built-in policy when annotation is missing, e.g.
        return FieldNamingPolicy.IDENTITY.translateName(f);
    }
}


然后在创建Gson对象时指定它。

Gson gson = new GsonBuilder()
        .setFieldNamingStrategy(new MyNamingStrategy())
        .create();


并像在问题中一样使用它。

class MyClass{
    @MyAnnotation("grrrr")
    private String myString;
}


请注意,@SerializedName会覆盖任何已定义的策略,因此,如果同时指定@SerializedName@MyAnnotation,则将使用@SerializedName值。

关于java - 如何替换SerializedName,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58855447/

10-12 02:52