13

私は次の注釈を持つクラスを持っています:

class A {
public Map<String,List<String>> references;

@JsonProperty
public Map<String,List<String>> getReferences() {
...
}

@JsonIgnore
public void setReferences(Map<String,List<String>>) {
}
...
}
}

私が試みているのは、逆シリアル化でjsonを無視することです。しかし、うまくいきません。JSON 文字列が到着すると、Jackson lib は常に参照属性を埋めます。@JsonIgnore アノテーションのみを使用すると、ゲッターは機能しません。この問題の解決策はありますか?

ありがとう

4

5 に答える 5

16

必要に応じて「読み取り専用コレクション」を作成できるようにするための重要な要素が 2 つあります。まず、セッターを無視することに加えて、フィールドにも次のマークが付いていることを確認して@JsonIgnoreください。

class A {

  @JsonIgnore
  public Map<String,List<String>> references;

  @JsonProperty
  public Map<String,List<String>> getReferences() { ... }

  @JsonIgnore
  public void setReferences(Map<String,List<String>>) { ... }

}

次に、ゲッターがセッターとして使用されないようにするために、USE_GETTERS_AS_SETTERS機能を無効にします。

ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.USE_GETTERS_AS_SETTERS);
于 2013-02-11T23:59:01.067 に答える
3

ゲッターで使用@JsonIgnoreしましたが、機能せず、マッパーを構成できませんでした (Jackson Jaxrs プロバイダーを使用していました)。これは私のために働いた:

@JsonIgnoreProperties(ignoreUnknown = true, value = { "actorsAsString",
    "writersAsString", "directorsAsString", "genresAsString" }) 
于 2015-04-03T23:27:07.477 に答える
0

マッピングの参照を持たない基本クラスを使用してから、実際のクラスにキャストするという、ジャクソン以外のソリューションしか考えられません。

// expect a B on an incoming request
class B {
// ...
}

// after the data is read, cast to A which will have empty references
class A extends B {
public Map<String,List<String>> references;
}

必要ないのに、なぜ参照を送信するのですか?

それとも、着信データが手元になく、jackson が着信参照用に設定するプロパティを見つけられないというマッピング例外を回避したいだけですか? そのために、すべての Json モデル クラスが継承する基本クラスを使用します。

public abstract class JsonObject {

    @JsonAnySetter
    public void handleUnknown(String key, Object value) {

        // for us we log an error if we can't map but you can skip that
        Log log = LogFactory.getLog(String.class);    
        log.error("Error mapping object of type: " + this.getClass().getName());    
        log.error("Could not map key: \"" + key + "\" and value: \"" + "\"" + value.toString() + "\"");

    }

次に、POJO に追加@JsonIgnorePropertiesして、着信プロパティが転送されるようにします。handleUnknown()

@JsonIgnoreProperties
class A extends JsonObject {
    // no references if you don't need them
}

編集

この SO スレッドでは、Mixin の使用方法について説明しています。構造をそのまま維持したい場合は、これが解決策かもしれませんが、私は試していません。

于 2012-09-26T06:17:30.740 に答える