26

以下のコードとして:

public class Main {

    public class innerPerson{
        private String name;
        public String getName(){
            return name;
        }
    }


    public static void main(String[] args){
        ObjectMapper om = new ObjectMapper();

        Map<innerPerson, String> map = new HashMap<innerPerson,String>();

        innerPerson one = new Main().new innerPerson();
        one.name = "david";

        innerPerson two = new Main().new innerPerson();
        two.name = "saa";

        innerPerson three = new Main().new innerPerson();
        three.name = "yyy";

        map.put(one, "david");
        map.put(two, "11");
        map.put(three, "true");



        try {
            String ans = om.writeValueAsString(map);

            System.out.println(ans);


        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

出力は次のとおりです。

{"Main$innerPerson@12d15a9":"david","Main$innerPerson@10a3b24":"true","Main$innerPerson@e91f5d":"11"}

マップのキーを正確なデータにすることはできますが、オブジェクトのアドレスだけにすることはできませんか?どのように?

4

4 に答える 4

40

JSONを使用する場合、マップのキーとしてオブジェクトを作成できますか?

厳密には、いいえ。JSONマップデータ構造は、名前と値のペアのコレクションである JSONオブジェクトデータ構造であり、要素名は文字列である必要があります。したがって、JSON オブジェクトをマップとして認識してバインドすることは合理的ですが、JSON マップ キーも文字列でなければなりません。JSON マップは JSON オブジェクトであるためです。JSON オブジェクト (マップ) 構造の仕様は、http://www.json.orgで入手できます。

マップのキーを正確なデータにすることはできますが、オブジェクトのアドレスのみにすることはできませんか? どのように?

Costi は、Jackson のデフォルトのマップ キー シリアライザーの動作を正しく説明しました。これtoString()は Java マップ キーのメソッドを呼び出すだけです。JSON に適したマップ キーの表現を返すようにメソッドを変更する代わりにtoString()、Jackson を使用してカスタム マップ キーのシリアル化を実装することも可能であり、かなり簡単です。これを行う 1 つの例は、Serializing Map<Date, String> with Jackson で利用できます。

于 2012-07-24T15:19:21.833 に答える
3

表示される「アドレス」は、単にtoString()メソッドが返すものです。

今のところ JSON マーシャリングを無視する コードが機能するためには、クラス内equals()hashCode()とを実装する必要があります。で name プロパティを返すと、それが JSON 表現のキーになります。toString()InnerPersontoString()

equals()しかし、との適切な実装がhashCode()なければ、HashMap を適切に使用することはできません。

于 2012-07-24T10:25:38.470 に答える
2

既存の正解に加えて、Module インターフェイス (通常はSimpleModule) を使用して、カスタムのキー シリアライザーとキー デシリアライザーを追加することもできます。これにより、キーのシリアライゼーションとデシリアライゼーションを外部で定義できます。いずれにせよ、他の人が指摘したように、JSON のキーは文字列でなければなりません。

于 2012-07-24T17:08:12.247 に答える