2011-07-06 13 views
3

ジャクソンを使用して元々作成されたJSONの一部を逆シリアル化しようとしています。リストはプライベートメンバではありませんが、オンザフライで生成どこジャクソンJSON逆シリアル化 - 合成リストゲッター

public List<Team> getTeams() { 
    // create the teams list 
} 

:モデルは、合成リストゲッターを持っています。これでserializeはうまくいきますが、逆シリアル化ではgetTeamsを使用します。これはおそらくジャクソンが変更可能なリストを持つゲッターを見て、それをセッターとして使用できると考えているからです。 getTeamsの内部は、Jacksonがまだ実装していない他のフィールドに依存しています。その結果はNPEです。つまり、注文はここの問題の1つだと思いますが、解決したいとは思いません。

getTeamsに注釈を付けて、セッターとして使用することはありませんが、はゲッターとしてです。これは可能ですか?助言がありますか?

答えて

4

無効DeserializationConfig.Feature.USE_GETTERS_AS_SETTERS

mapper.configure(DeserializationConfig.Feature.USE_GETTERS_AS_SETTERS, false); 

この行を短くするには、静的インポートを使用します。

または、アノテーションでこの1つのプロパティの設定を行い、上記のようにグローバル設定を指定しない場合は、「チーム」の設定者として何かをマークします。

public class Foo 
{ 
    @JsonSetter("teams") 
    public void asdf(List<Team> teams) 
    { 
    System.out.println("hurray!"); 
    } 

    public List<Team> getTeams() 
    { 
    // generate unmodifiable list, to fail if change attempted 
    return Arrays.asList(new Team()); 
    } 

    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper(); 
    String fooJson = mapper.writeValueAsString(new Foo()); 
    System.out.println(fooJson); 
    // output: {"teams":[{"name":"A"}]} 

    // throws exception, without @JsonSetter("teams") annotation 
    Foo fooCopy = mapper.readValue(fooJson, Foo.class); 
    // output: hurray! 
    } 
} 

class Team 
{ 
    public String name = "A"; 
} 
+0

正しいこと:@JsonSetterの代わりに@JsonProteryが動作することにも注意してください。@JsonSetterは、署名によるゲッターではないためです。 – StaxMan

+0

ヒントをありがとう。私はその設定を忘れていて、このインスタンスでそれを使用して幸せです。また、@JsonSetterまたは@JsonPropertyを使用しているセッターの経路変更について知っておくとよい – David

関連する問題