7

ジャクソンはメソッドベースのシリアル化を行っていると思いますが、フィールドベースにする方法はありますか?

元:

class Bean {
    Integer i;
    String s;

    public Integer getI() { return this.i; }
    public void setI(Integer i) { this.i = i; }
    public bool isSetI() { return this.i != null; }

    // same for s as well
}

出力JSONには「i」と「setI」があります。とにかくこれをオーバーライドして「i」だけを取得することはできますか?また、クラスにアノテーションを追加せずにこれを行う方法があれば素晴らしいでしょう(それらは自動生成されます)。

4

4 に答える 4

12

@JsonAutoDetectアノテーションを確認してください。例:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE)
public class Bean {
    Integer i;
    String s;

    Integer getI() { return this.i; }
    void setI(Integer i) { this.i = i; }
    bool isSetI() return { this.i == null; }

    // same for s as well
}
于 2013-01-06T16:05:20.577 に答える
6

ジャクソンはフィールドも使用できます、はい。ただし、デフォルトでは、パブリックフィールドのみが検出されます。@JsonPropertyただし、非公開フィールドをマークするために使用できます。

注意すべき点の1つは、メソッド(setX、getX)とフィールド(x)の両方がある場合、メソッドが優先されるということです。これは通常問題ではありませんが、問題がある場合は、使用しないメソッドに@JsonIgnoreenxtを追加して、明示的に無効にする必要があります。

于 2012-04-20T21:17:21.007 に答える
5

ObjectMapperアノテーションなしでこれを実現するには、次の方法でシリアル化/逆シリアル化の前に構成できます。

ObjectMapper om = new ObjectMapper();
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker().
            withGetterVisibility(JsonAutoDetect.Visibility.NONE).
            withSetterVisibility(JsonAutoDetect.Visibility.NONE));
于 2013-03-07T10:37:48.970 に答える
3

受け入れられた答えは、私にとって期待された結果を生み出しませんでした。アノテーションを追加せずに機能するのObjectMapperは、次のように構成することです。

ObjectMapper om = new ObjectMapper()
        .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
        .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

これは私にとってより理にかなっているように思われる方法であり、標準のJavaシリアル化のようにgetters\settersの代わりにフィールドを使用します。

于 2017-01-23T13:14:02.253 に答える