为了账号安全,请及时绑定邮箱和手机立即绑定

GSON 递归解码映射键

GSON 递归解码映射键

万千封印 2021-10-17 15:35:52
我想使用 GSON 来解码键不是字符串的映射数组。我知道 JSON 类型不允许将对象用作键,所以我希望 GSON 可以递归工作来解码字符串。爪哇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 示例[    {        "map": {            "{\"a\": 0, \"b\": 0}": 1        }    }]我想在这里实现的是,字符串"{\"a\": 0, \"b\": 0}"被 GSON 解码为一个类型的对象,Key两个成员都设置为 0。然后,该对象可用于填写 Data 类的 HashMap。这有可能实现吗?
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

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


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和反序列化:


Data[] mapPojos = new GsonBuilder().registerTypeAdapter(Key.class, ds).create()

            .fromJson(x, Data[].class);


查看完整回答
反对 回复 2021-10-17
  • 1 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信