GSON递归解码映射密钥

时间:2018-09-27 16:16:33

标签: java json gson

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

Java

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 个答案:

答案 0 :(得分:0)

您可以使用自定义df %>% separate_rows(phrase,sep = " and ") %>% group_by(item) %>% summarise(Last = last(phrase)) 实现此目的。使用自定义反序列化器,您可以决定如何对此类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