在使用GSONparsingJSON时使用Enums
这与我在前面提到的一个前面的问题有关
使用Gson的JSONparsing
我试图parsing相同的JSON,但是现在我已经改变了我的一些类。
{ "lower": 20, "upper": 40, "delimiter": " ", "scope": ["${title}"] }
我的课目前看起来像:
public class TruncateElement { private int lower; private int upper; private String delimiter; private List<AttributeScope> scope; // getters and setters } public enum AttributeScope { TITLE("${title}"), DESCRIPTION("${description}"), private String scope; AttributeScope(String scope) { this.scope = scope; } public String getScope() { return this.scope; } }
这段代码抛出一个exception,
com.google.gson.JsonParseException: The JsonDeserializer EnumTypeAdapter failed to deserialized json object "${title}" given the type class com.amazon.seo.attribute.template.parse.data.AttributeScope at
这个例外是可以理解的,因为根据我以前的问题的解决scheme,GSON期望Enum对象实际上被创build为
${title}("${title}"), ${description}("${description}");
但是由于这在语法上是不可能的,所以推荐的解决scheme是什么?
从Gson的文档 :
Gson为枚举提供了默认的序列化和反序列化…如果您希望更改默认表示,可以通过GsonBuilder.registerTypeAdapter(Type,Object)注册types适配器来实现。
以下是一个这样的方法。
import java.io.FileReader; import java.lang.reflect.Type; import java.util.List; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; public class GsonFoo { public static void main(String[] args) throws Exception { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(AttributeScope.class, new AttributeScopeDeserializer()); Gson gson = gsonBuilder.create(); TruncateElement element = gson.fromJson(new FileReader("input.json"), TruncateElement.class); System.out.println(element.lower); System.out.println(element.upper); System.out.println(element.delimiter); System.out.println(element.scope.get(0)); } } class AttributeScopeDeserializer implements JsonDeserializer<AttributeScope> { @Override public AttributeScope deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { AttributeScope[] scopes = AttributeScope.values(); for (AttributeScope scope : scopes) { if (scope.scope.equals(json.getAsString())) return scope; } return null; } } class TruncateElement { int lower; int upper; String delimiter; List<AttributeScope> scope; } enum AttributeScope { TITLE("${title}"), DESCRIPTION("${description}"); String scope; AttributeScope(String scope) { this.scope = scope; } }
我想扩大NAZIK / user2724653答案(对于我的情况)。 这是一个Java代码:
public class Item { @SerializedName("status") private Status currentState = null; // other fields, getters, setters, constructor and other code... public enum Status { @SerializedName("0") BUY, @SerializedName("1") DOWNLOAD, @SerializedName("2") DOWNLOADING, @SerializedName("3") OPEN } }
在json文件中,只有一个字段"status": "N",
,其中N = 0,1,2,3 – 取决于状态值。 因此, GSON
可以很好地处理嵌套enum
类的值。 在我的情况下,我已经parsing了从json
数组中的Items
列表:
List<Item> items = new Gson().<List<Item>>fromJson(json, new TypeToken<List<Item>>(){}.getType());
使用注释@SerializedName
:
@SerializedName("${title}") TITLE, @SerializedName("${description}") DESCRIPTION
使用GSON 2.2.2版本,enum将被轻松整理和解组。
import com.google.gson.annotations.SerializedName; enum AttributeScope { @SerializedName("${title}") TITLE("${title}"), @SerializedName("${description}") DESCRIPTION("${description}"); private String scope; AttributeScope(String scope) { this.scope = scope; } public String getScope() { return scope; } }