首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在使用GSON解析JSON时使用枚举

在使用GSON解析JSON时使用枚举
EN

Stack Overflow用户
提问于 2011-11-21 19:46:08
回答 6查看 103.1K关注 0票数 141

这与我之前在这里提出的一个问题有关

JSON parsing using Gson

我正在尝试解析相同的JSON,但现在我更改了我的类。

代码语言:javascript
复制
{
    "lower": 20,
    "upper": 40,
    "delimiter": " ",
    "scope": ["${title}"]
}

我的类现在看起来像:

代码语言:javascript
复制
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;
    }
}

这段代码抛出一个异常,

代码语言:javascript
复制
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 

这个异常是可以理解的,因为根据我前面问题的解决方案,GSON期望Enum对象实际上是这样创建的

代码语言:javascript
复制
${title}("${title}"),
${description}("${description}");

但是由于这在语法上是不可能的,那么推荐的解决方案是什么呢?

EN

回答 6

Stack Overflow用户

发布于 2013-09-17 21:32:14

我想扩展一下NAZIK/user2724653的答案(对于我的情况)。下面是一段Java代码:

代码语言:javascript
复制
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类的值。在我的例子中,我解析了json数组中的Items列表:

代码语言:javascript
复制
List<Item> items = new Gson().<List<Item>>fromJson(json,
                                          new TypeToken<List<Item>>(){}.getType());
票数 350
EN

Stack Overflow用户

发布于 2013-08-28 16:52:19

使用注解@SerializedName

代码语言:javascript
复制
@SerializedName("${title}")
TITLE,
@SerializedName("${description}")
DESCRIPTION
票数 36
EN

Stack Overflow用户

发布于 2018-03-16 17:57:00

下面的代码片段使用@JsonAdapter(class)注释消除了显式Gson.registerTypeAdapter(...)的需要,该注释从Gson 2.3开始提供(请参阅注释pm_labs)。

代码语言:javascript
复制
@JsonAdapter(Level.Serializer.class)
public enum Level {
    WTF(0),
    ERROR(1),
    WARNING(2),
    INFO(3),
    DEBUG(4),
    VERBOSE(5);

    int levelCode;

    Level(int levelCode) {
        this.levelCode = levelCode;
    }

    static Level getLevelByCode(int levelCode) {
        for (Level level : values())
            if (level.levelCode == levelCode) return level;
        return INFO;
    }

    static class Serializer implements JsonSerializer<Level>, JsonDeserializer<Level> {
        @Override
        public JsonElement serialize(Level src, Type typeOfSrc, JsonSerializationContext context) {
            return context.serialize(src.levelCode);
        }

        @Override
        public Level deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
            try {
                return getLevelByCode(json.getAsNumber().intValue());
            } catch (JsonParseException e) {
                return INFO;
            }
        }
    }
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8211304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档