Gson如何获取序列化名称

时间:2014-06-09 05:51:44

标签: java gson

当我们定义一个具有以下格式的类

public class Field {
    @SerializedName("name")
    public String name;
    @SerializedName("category")
    public String category;

}

代表JsonObject内容

{
    "name" : "string",
    "category" : "string",
}

并使用Gson解析内容

Field field = new GsonBuilder().create().fromJson(
                content, Field.class);

所以,我的问题是我们可以使用Gson来获取@Serialized名称。在本例中,我想知道@Serialized使用的field.name名称是name,而field.categorycategory

根据@Sotirios Delimanolis的建议,使用Reflection我们可以获得Serialized名称

java.lang.reflect.Field fields = Field.class.getDeclaredField("name");             
SerializedName sName =fields.getAnnotation(SerializedName.class);            
System.out.println(sName.value()); 

3 个答案:

答案 0 :(得分:14)

使用反射来检索所需的Field对象。然后,您可以使用Field#getAnnotation(Class)获取SerializedName个实例,您可以在其中调用value()来获取名称。

答案 1 :(得分:0)

不是使用Field.class进行解析,而是将其解析为JsonObject.class了吗?然后使用JsonObject.get()

import com.google.gson.JsonObject;

Gson gson = new GsonBuilder().create();
JsonObject jsonObject = gson.fromJson(content, JsonObject.class);
String serializedName = jsonObject.get("name").getAsString();

请注意,.getAsString()将以没有嵌入双引号的String形式返回,将其与调用toString()时的情况进行比较。


我试图做的一件事是序列化一个枚举字段,这不是一个对象。在这种情况下,您可以使用JsonElement.class进行序列化,因为它只是原始类型:

import com.google.gson.JsonElement;

Gson gson = new GsonBuilder().create();
JsonElement jsonElement = gson.fromJson("\"a\"", JsonElement.class);
String serializedName = jsonElement.getAsString();

答案 2 :(得分:0)

这是一种使用 alternate 的方法,例如用于更复杂的示例

枚举类

public enum SomeStatusCd {

    @SerializedName(
        value = "status_1",
        alternate = {"an alternate 1", "an alternate 2"}
    )
    STATUS_1("status_1")
    ....
}

从alternate获取枚举

public static SomeStatusCd getFromAlternate(String alternateFieldName){
    SomeStatusCd result = null;
    Field[] statusDeclaredFields = SomeStatusCd.class.getDeclaredFields();
    String foundEnumName = null;
    for (Field statusDeclaredField : statusDeclaredFields) {
        SerializedName annotation = statusDeclaredField.getAnnotation(SerializedName.class);
        if (annotation != null){
            String[] declaredFieldAlternates = annotation.alternate();
            for (String declaredFieldAlternate : declaredFieldAlternates) {
                if (declaredFieldAlternate.equals(alternateFieldName)){
                    foundEnumName = statusDeclaredField.getName();
                }
            }
        }
    }
    if (foundEnumName != null){
        for (SomeStatusCd enumConstant : SomeStatusCd.class.getEnumConstants()) {
            if (enumConstant.name().equals(foundEnumName)){
                result = enumConstant;
            }
        }
    }

    return result;
}

测试一下

    SomeStatusCd fromAlternate = getFromAlternate("an alternate 1");
    assertSame(fromAlternate, SomeStatusCd.STATUS_1);