首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >GSON递归解码映射键

GSON递归解码映射键
EN

Stack Overflow用户
提问于 2018-09-28 00:16:33
回答 1查看 223关注 0票数 0

我想使用GSON来解码一个map数组,其中的键不是String。我知道JSON类型不允许将对象用作键,所以我希望可以让GSON递归地解码字符串。

Java

代码语言:javascript
复制
public class Reader {
    static class Key {
        int a;
        int b;
    }
    static class Data {
        HashMap<Key, Integer> map;
    }


    public static void read() {
        Gson gson = new Gson();
        String x = "[{\"map\": { \"{\\\"a\\\": 0, \\\"b\\\": 0}\": 1 }}]";
        Data[] y = gson.fromJson(x, Data[].class);
    }
}

JSON示例

代码语言:javascript
复制
[
    {
        "map": {
            "{\"a\": 0, \"b\": 0}": 1
        }
    }
]

我想在这里实现的是,GSON将字符串"{\"a\": 0, \"b\": 0}"解码为Key类型的对象,两个成员都设置为0。然后,该对象可用于填充数据类的HashMap。

这有可能实现吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 03:29:43

您可以使用自定义JsonDeserializer来实现这一点。使用自定义的反序列化程序,您可以决定如何反序列化这个类Key。在某个地方实现它,内联示例如下:

代码语言:javascript
复制
public JsonDeserializer<Key> keyDs = new JsonDeserializer<Key>() {
    private final Gson gson = new Gson(); 
    @Override
    public Key deserialize(JsonElement json, Type typeOfT,
                               JsonDeserializationContext context)
            throws JsonParseException {
        // This will be valid JSON
        String keyJson = json.getAsString();
        // use another Gson to parse it, 
        // otherwise you will have infinite recursion
        Key key = gson.fromJson(keyJson, Key.class);
        return key;
    }
};

将其注册到GsonBuilder,创建Gson并反序列化:

代码语言:javascript
复制
Data[] mapPojos = new GsonBuilder().registerTypeAdapter(Key.class, ds).create()
            .fromJson(x, Data[].class);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52541220

复制
相关文章

相似问题

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