2

この種のオブジェクトをjsonで使用したいと思います。

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

jsonはオブジェクトキーを配列として処理できないようですので、次のように転送する必要があります。

{
"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();

より速い方法はありますか?はい、そうだと思います。キーの各部分には重要な意味があるため、キーをマップ複合キーに分割するだけです。

thx、そして編集のためにsry

4

2 に答える 2

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 に答える
1

プロファイル値については、残念ながらオブジェクトよりも優れているかどうかはわかりません

リスト形式ではない単一の値のエントリを特別に処理することで、List<String>またはが自然にフィットするように見えます。String[]

残念ながら、JSON構造の逆シリアル化の問題は、リストである場合とオブジェクトである場合があり、SOで繰り返し発生します。幸いなことに、解決策もあります。

于 2012-07-13T20:23:59.760 に答える