[英]Gson how to get serialized name
当我们用以下格式定义一个类时
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());
使用反射来检索您想要的Field
对象。 然后,您可以使用Field#getAnnotation(Class)
获取一个SerializedName
实例,您可以在该实例上调用value()
来获取名称。
不是用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()
会将其作为没有嵌入双引号的字符串返回,将其与调用toString()
时进行比较。
我试图做的一件事是序列化一个枚举字段,它不是一个对象。 在这种情况下,您可以使用JsonElement.class
进行序列化,因为它只是一个原语:
import com.google.gson.JsonElement;
Gson gson = new GsonBuilder().create();
JsonElement jsonElement = gson.fromJson("\"a\"", JsonElement.class);
String serializedName = jsonElement.getAsString();
这是一种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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.