2

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

class Message{
    int code;
    String user;
    Map<List<String>, List<String>> profile;
}

似乎 json 无法将 Object 键作为数组处理,所以我需要像这样传输它们:

{
"code": 1,
"user": "John",
"profile": {
    "type,1": ["tester"],
    "lang,2": ["fr", "it", "en", "sp"],
    "rate,4": ["10", "1000"],
    "date,5": ["134118329", "1341973211"]

    }
}

或者

{
"code": 1,
"user": "John",
"profile": {
    "type": [1,"tester"],
    "lang": [2,"fr", "it", "en", "sp"],
    "rate": [4,"10", "1000"],
    "date": [5,"134118329", "1341973211"]

    }
}

第一个 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;
    }
}

...

GsonBuilder g = new GsonBuilder();
    g.registerTypeAdapter(Map.class, new MyAdapter());
    Gson gson = g.create();

有更快的方法吗?我猜是的,思路就是把key拆分成一个Map组合key,因为key的每一部分都有重要的意义

谢谢,很抱歉编辑

4

2 回答 2

1

对于配置文件值,不幸的是我不知道是否有比 Object 更好的

它看起来像List<String>orString[]会很自然,对非列表格式的单值条目进行特殊处理。

不幸的是,反序列化有时是一个列表,有时是一个对象的 JSON 结构的问题在 SO 上反复出现。幸运的是,也有解决方案

于 2012-07-13T20:23:59.760 回答
1

这行不通。

根据规范的对象声明语法:

对象是一组无序的名称/值对。对象以 {(左大括号)开始,以 }(右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。

这个:

{
    ["type", 1]: "tester",
    ["lang", 2]: ["fr", "it", "en", "sp"],
    ["rate", 4]: ["10", "1000"],
    ["date", 5]: ["134118329", "1341973211"]

}

无效,因此您无法使用 Gson 读取导致以下异常:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING

json: 前面的名称aRequest =也无效。

于 2012-07-13T20:03:23.783 回答