3

StringフィールドとMapフィールドを含む次のクラスがあります。Jacksonを使用してjsonにシリアル化したい。

public class Mapping 

    private String mAttribute;

    @JsonIgnore
    private Map<String, String> mMap;

    @JsonAnyGetter
    public Map<String, String> getMap() {
        //some logic to populate map
    }

    @JsonAnySetter
    public void put(// some params) {
        //some more logic
    }

    @JsonProperty(value = "attribute")
    public String getAttribute() {
        return mAttribute;
    }

    public void setAttribute(String aAttribute) {
        mAttribute= aAttribute;
    }
}

Mappingオブジェクトをインスタンス化してから、それを使用ObjectMapperしてファイルに書き込みます。

ObjectMapper om = new ObjectMapper();
om.writeValue(destFile, myMappingObject);

何らかの理由で、MappingインスタンスmyMappingObjectを2回書き込んでいます。どこかに可視性オプションを設定していないと思いますが、どこにあるのかわかりません。

jsonは次のようになりますが、ファイルに2回だけ表示されます。

{
    "attribute" : "someValue",
    "map-key1" : "map-value1",
    "map-key2" : "map-value2"
}

これはありますが、以前のバージョンのジャクソンで修正されたようです。また、メソッドの名前をに変更しようとしましたが、random()それでも2回呼び出されます(必要な回数)。

4

1 に答える 1

4

問題は上記のクラスとは何の関係もありませんでした。のリストがある別のクラスを使用していましたMapping。前:

public class MappingsList {
    @JsonProperty
    private List<Mapping> mappings;

    public List<Mapping> getMappings() {return mappings;}
}

後:

public class MappingsList {        
    private List<Mapping> mappings;

    @JsonProperty
    public List<Mapping> getMappings() {return mappings;}
}

そしてそれはうまくいった。原因は、ObjectMapperがMappingsListクラス内の2つのプロパティを認識していたため、両方でシリアル化を実行していたことです。最初にmappingsフィールド用にjsonを作成し、次にgetMappings()メソッド用にjsonを作成します。

于 2013-01-14T18:51:29.757 に答える