0

マップを含むオブジェクトがあり、マップ内の各値は、いくつかのプリミティブと次のようなリストで構成される別のオブジェクトです。

Class A { 
    String sa;
    Map<B, B> mapOfBs;
}

Class B {
    String sb;
    List<C> listOfCs;
}

Class C {
    String sc;
}

説明のために、いくつかの情報を保持するクラスインスタンスがあります(これは、以下の解析されたjsonから表すことができますが、それほど重要ではありません...)。GSONを使用してこのクラスをシリアル化すると、サーバー側で次のように取得されます。

{
"sa": "aaaa",
"mapOfBs": {
    "k.l.z.B@405bb400": {
        "sb": "bbb",
        "listOfCs": []
    },
    "k.l.z.B@405bd968": {
         "sb": "bbbb2",
        "listOfCs": []
    }
}

これは、文字列を逆シリアル化しようとしたときに本質的にエラーを引き起こします。私が得る例外はExpected BEGIN_OBJECT but was STRING、クラスBの完全修飾名が文字列のどこに埋め込まれているかを指す""です。

完全修飾名が挿入されている理由がわからないため、クラスBの解析で問題が発生しているように感じます。(Csの)リストも表示されていないので、私の気持ちはさらに強くなります...

誰でもここで助けることができますか?(前もって感謝します)

4

2 に答える 2

0

これがまだ役立つかどうかはわかりません。

あなたが試すことができます

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
String jsonString = gson.toJson(object));
于 2013-08-16T08:33:19.647 に答える
0

POJO で次のように宣言しましたMapMap<B,B> mapOfBs

あなたはJSONを持っています...そうではありません。

"mapOfBs": {
    "k.l.z.B@405bb400": {
        "sb": "bbb",
        "listOfCs": []
    },
 ...

"k.l.z.B@405bb400"は間違いなく a ではなく、BGson はそれを伝えています。たとえば、「でも String でした」

JSON には次のものがあります。Map<String, B> mapOfBs

以下のコメントから追加する編集:あなたがこのようにシリアル化されている理由Mapは、 a のキーに対する Gson のデフォルトのシリアル化メソッドがキーMapを呼び出すtoString()ことです。POJO はオーバーライドしないため、出力toString()が得られます。Object.toString()

JSON 自体は、あなたがやろうとしていることをサポートしていません。JSON の仕様 ( http://www.json.org/ ) を見ると、名前部分が文字列である名前と値のペアで構成されていることがわかります。左側にオブジェクトを持つことはできません。

于 2013-01-15T14:20:59.543 に答える