我想使用GSON来解码一个map数组,其中的键不是String。我知道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
}
}
]
我想在这里实现的是,GSON将字符串"{\"a\": 0, \"b\": 0}"
解码为Key
类型的对象,两个成员都设置为0。然后,该对象可用于填充数据类的HashMap。
这有可能实现吗?
发布于 2018-09-28 03:29:43
您可以使用自定义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);
https://stackoverflow.com/questions/52541220
复制相似问题