Java gson:使用复合键反序列化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

我想将这种对象与json一起使用:

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"]

}