当我们定义一个具有以下格式的类
时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.category
是category
。
根据@Sotirios Delimanolis的建议,使用Reflection
我们可以获得Serialized
名称
java.lang.reflect.Field fields = Field.class.getDeclaredField("name");
SerializedName sName =fields.getAnnotation(SerializedName.class);
System.out.println(sName.value());
答案 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")
....
}
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);