Java gson:使用复合键反序列化json
我想将这种对象与json一起使用:Java gson:使用复合键反序列化json,java,json,serialization,map,gson,Java,Json,Serialization,Map,Gson,我想将这种对象与json一起使用: class Message{ int code; String user; Map<List<String>, List<String>> profile; } 或 第一个json可能更简单,即使它依赖于硬字符串分隔符 因此,对于第一个,我似乎必须编写这个巨大的适配器: private static class MyAdapter implements JsonSerializer<Map&l
class Message{
int code;
String user;
Map<List<String>, List<String>> profile;
}
或
第一个json可能更简单,即使它依赖于硬字符串分隔符
因此,对于第一个,我似乎必须编写这个巨大的适配器:
private static class MyAdapter implements JsonSerializer<Map<List<String>, List<String>>>,
JsonDeserializer<Map<List<String>, List<String>>> {
@Override
public JsonElement serialize(Map<List<String>, List<String>> m,
Type type, JsonSerializationContext context) {
JsonObject j = new JsonObject();
for (Entry<List<String>, List<String>> e : m.entrySet() ){
JsonArray jj=new JsonArray();
for (String s : e.getValue()){
jj.add(new JsonPrimitive(s));
}
j.add(e.getKey().get(0)+","+e.getKey().get(1), jj);
}
return j;
}
@Override
public Map<List<String>, List<String>> deserialize(JsonElement json, Type type,
JsonDeserializationContext arg2) throws JsonParseException {
Map<List<String>, List<String>> m = new HashMap<List<String>, List<String>>();
JsonObject jObject = json.getAsJsonObject();
for (Entry<String, JsonElement> e : jObject.entrySet() ){
List<String> key = new ArrayList<String>();
List<String> value = new ArrayList<String>();
for (String s : e.getKey().split(",") ){
key.add(s);
}
for (JsonElement jj : e.getValue().getAsJsonArray() ){
value.add(jj.getAsString());
}
m.put(key, value);
}
return m;
}
}
有没有更快的办法?我想是的,这个想法只是将密钥分割成一个Map复合密钥,因为密钥的每个部分都有重要的意义
用于编辑的thx和sry将不起作用
对象声明语法符合:
对象是一组无序的名称/值对。对象开始
以{(左大括号)结束,以}(右大括号)结束。每个名字都是
后跟:(冒号),名称/值对之间用,
(逗号)
这:
无效,因此您无法使用Gson进行读取,导致以下异常:com.google.Gson.JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN\u对象,但为STRING
json前面的名称:aRequest=
也无效
对于配置文件值,我不知道是否有比Object更好的配置文件
它看起来像是一个列表
或字符串[]
将是一个自然的匹配,对非列表格式的单值条目进行特殊处理
不幸的是,反序列化JSON结构(有时是列表,有时是对象)的问题已经反复出现。幸运的是,你从哪里得到了json?好的,json是无效的(jslint),让我纠正这个问题,完成了纠正我如何在json中做复合键?{“key”:[“a”,“b”],“value”:12}不够?如果有多个,它会给出一个数组?可以在地图中反序列化它吗?[“a”,“b”]作为keyno,key属性将映射到Map key as list。。。就在表示形式将被表示为一个名为keyI不理解的属性时,其思想是有{“key”:[“a”,“b”],“value”:12},{“key”:[“a”,“c”],“value”:14}。。。你如何将它们放在键值映射中,对我来说,你只需要使用数组就可以了,顺便说一句,thx,我几乎完全编辑了这个问题,你能再看一看吗?Sryth这篇文章的问题是一个非常移动的目标,有三种不同的(变化的)JSON结构。还有一个悬而未决的问题吗?是的,对,Q变化太大了,现在我只想知道如何最好地管理Json中不受支持的(a,b)组合键,这可能是一个新的Q,thx您的回答很有帮助
{
"code": 1,
"user": "John",
"profile": {
"type": [1,"tester"],
"lang": [2,"fr", "it", "en", "sp"],
"rate": [4,"10", "1000"],
"date": [5,"134118329", "1341973211"]
}
}
private static class MyAdapter implements JsonSerializer<Map<List<String>, List<String>>>,
JsonDeserializer<Map<List<String>, List<String>>> {
@Override
public JsonElement serialize(Map<List<String>, List<String>> m,
Type type, JsonSerializationContext context) {
JsonObject j = new JsonObject();
for (Entry<List<String>, List<String>> e : m.entrySet() ){
JsonArray jj=new JsonArray();
for (String s : e.getValue()){
jj.add(new JsonPrimitive(s));
}
j.add(e.getKey().get(0)+","+e.getKey().get(1), jj);
}
return j;
}
@Override
public Map<List<String>, List<String>> deserialize(JsonElement json, Type type,
JsonDeserializationContext arg2) throws JsonParseException {
Map<List<String>, List<String>> m = new HashMap<List<String>, List<String>>();
JsonObject jObject = json.getAsJsonObject();
for (Entry<String, JsonElement> e : jObject.entrySet() ){
List<String> key = new ArrayList<String>();
List<String> value = new ArrayList<String>();
for (String s : e.getKey().split(",") ){
key.add(s);
}
for (JsonElement jj : e.getValue().getAsJsonArray() ){
value.add(jj.getAsString());
}
m.put(key, value);
}
return m;
}
}
GsonBuilder g = new GsonBuilder();
g.registerTypeAdapter(Map.class, new MyAdapter());
Gson gson = g.create();
{
["type", 1]: "tester",
["lang", 2]: ["fr", "it", "en", "sp"],
["rate", 4]: ["10", "1000"],
["date", 5]: ["134118329", "1341973211"]
}