243

この豆'状態':

public class State {

    private boolean isSet;

    @JsonProperty("isSet")
    public boolean isSet() {
        return isSet;
    }

    @JsonProperty("isSet")
    public void setSet(boolean isSet) {
        this.isSet = isSet;
    }

}

ajax'success'コールバックを使用してネットワーク経由で送信されます:

        success : function(response) {  
            if(response.State.isSet){   
                alert('success called successfully)
            }

ここでアノテーション@JsonPropertyが必要ですか?それを使用する利点は何ですか?副作用を起こさずにこのアノテーションを削除できると思います。

https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotationsでこの注釈について読んでいます。これをいつ使用する必要があるのか​​わかりませんか?

4

9 に答える 9

298

これが良い例です。JSONは.Net、プロパティが大文字で始まる環境から取得されているため、変数の名前を変更するために使用します。

public class Parameter {
  @JsonProperty("Name")
  public String name;
  @JsonProperty("Value")
  public String value; 
}

これにより、JSONとの間で正しく解析されます。

"Parameter":{
  "Name":"Parameter-Name",
  "Value":"Parameter-Value"
}
于 2012-09-25T13:15:08.197 に答える
56

OldCurmudgeonとStaxManはどちらも正しいと思いますが、ここに簡単な例を示した1文の回答があります。

@JsonProperty(name)は、JSONプロパティ名を注釈付きのJavaフィールドの名前にマップするようにJacksonObjectMapperに指示します。

//example of json that is submitted 
"Car":{
  "Type":"Ferrari",
}

//where it gets mapped 
public static class Car {
  @JsonProperty("Type")
  public String type;
 }
于 2013-10-17T17:20:08.213 に答える
43

JsonPropertyは、通常のシリアル化と逆シリアル化とは別に、変数のgetterメソッドとsetterメソッドを指定するためにも使用されます。たとえば、次のようなペイロードがあるとします。

{
  "check": true
}

およびデシリアライザークラス:

public class Check {

  @JsonProperty("check")    // It is needed else Jackson will look got getCheck method and will fail
  private Boolean check;

  public Boolean isCheck() {
     return check;
  }
}

次に、この場合、JsonPropertyアノテーションが必要です。ただし、クラスにメソッドもある場合

public class Check {

  //@JsonProperty("check")    Not needed anymore
  private Boolean check;

  public Boolean getCheck() {
     return check;
  }
}

このドキュメントもご覧ください:http: //fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html

于 2014-11-05T20:43:46.083 に答える
25

アノテーションがないと、推測されたプロパティ名(JSONから一致する)は「設定」され、意図のように「isSet」ではありません。これは、Java Beansの仕様に従って、「isXxx」および「setXxx」の形式のメソッドは、管理する論理プロパティ「xxx」があることを意味すると解釈されるためです。

于 2012-09-26T02:53:18.400 に答える
10

ご存知のように、これはすべてオブジェクトのシリアル化と脱塩に関するものです。オブジェクトがあるとします。

public class Parameter {
  public String _name;
  public String _value; 
}

このオブジェクトのシリアル化は次のとおりです。

{
  "_name": "...",
  "_value": "..."
}

変数の名前は、データをシリアル化するために直接使用されます。システム実装からシステムAPIを削除しようとしている場合、場合によっては、シリアル化/逆シリアル化で変数の名前を変更する必要があります。@JsonPropertyは、オブジェクトをシリアル化する方法をシリアライザーに指示するメタデータです。これは、次の目的で使用されます。

  • 変数名
  • アクセス(読み取り、書き込み)
  • デフォルト値
  • 必須/オプション

例から:

public class Parameter {
  @JsonProperty(
        value="Name",
        required=true,
        defaultValue="No name",
        access= Access.READ_WRITE)
  public String _name;
  @JsonProperty(
        value="Value",
        required=true,
        defaultValue="Empty",
        access= Access.READ_WRITE)
  public String _value; 
}
于 2017-07-01T12:59:49.117 に答える
9

JsonPropertyを追加すると、問題のクラスがJsonオブジェクトにシリアル化されることに気付かずに、プロパティ名の1つを変更したいと誰かが判断した場合の安全性も確保されます。プロパティ名を変更した場合、JsonPropertyは、プロパティ名ではなく、Jsonオブジェクトで使用されることを保証します。

于 2018-04-25T10:14:20.180 に答える
8

上記のすべての回答に加えて、ドキュメントの一部を忘れないでください

非静的メソッドを論理プロパティの「セッター」または「ゲッター」として定義するために使用できるマーカー注釈(その署名に応じて)、または論理として使用される非静的オブジェクトフィールド(シリアル化、逆シリアル化)財産。

non-staticクラスに従来型ではないメソッドがある場合は、そのアノテーションを使用して、そのメソッドをのgetter or setterように動作させることができます。getter and setter以下の例を参照してください

public class Testing {
    private Integer id;
    private String username;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getIdAndUsername() {
        return id + "." + username; 
    }

    public String concatenateIdAndUsername() {
        return id + "." + username; 
    }
}

上記のオブジェクトがシリアル化されると、応答には次の内容が含まれます

  • からのユーザー名getUsername()
  • からのIDgetId()
  • idAndUsername from getIdAndUsername*

メソッドgetIdAndUsernameはで始まるので、getそれは通常のゲッターとして扱われます。したがって、なぜそのようなものに。で注釈を付けることができるのでしょうか@JsonIgnore

が返されないことに気付いた場合concatenateIdAndUsername、それは名前がで始まらないためでgetあり、そのメソッドの結果を応答に含めたい場合は、を使用でき、上記の強調表示されたドキュメントに記載されているように@JsonProperty("...")通常どおりに扱われます。 getter/setter

于 2019-05-29T19:55:11.677 に答える
4

他の回答に加えて、引数なしのコンストラクターを持たないクラスでアノテーション@JsonPropertyを使用する場合、アノテーションは非常に重要です。@JsonCreator

public class ClassToSerialize {

    public enum MyEnum {
        FIRST,SECOND,THIRD
    }

    public String stringValue = "ABCD";
    public MyEnum myEnum;


    @JsonCreator
    public ClassToSerialize(MyEnum myEnum) {
        this.myEnum = myEnum;
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST);
        String jsonString = mapper.writeValueAsString(classToSerialize);
        System.out.println(jsonString);
        ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class);
        System.out.println("StringValue: " + deserialized.stringValue);
        System.out.println("MyEnum: " + deserialized.myEnum);
    }
}

この例では、唯一のコンストラクターがとしてマークされている@JsonCreatorため、Jacksonはこのコンストラクターを使用してインスタンスを作成します。しかし、出力は次のようになります。

シリアル化:{"stringValue": "ABCD"、 "myEnum": "FIRST"}

スレッド"main"の例外com.fasterxml.jackson.databind.exc.InvalidFormatException: 文字列値'stringValue'からClassToSerialize$ MyEnumのインスタンスを構築できません:宣言された列挙型インスタンス名の1つではない値:[FIRST、SECOND、THIRD]

しかし@JsonProperty、コンストラクターに注釈を追加した後:

@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
    this.myEnum = myEnum;
}

デシリアライズは成功します:

シリアル化:{"myEnum": "FIRST"、 "stringValue": "ABCD"}

StringValue:ABCD

MyEnum:FIRST

于 2018-02-08T18:31:39.683 に答える
0

JsonProperty javadocから、

論理プロパティの名前、つまりプロパティに使用するJSONオブジェクトのフィールド名を定義します。値が空の場合、文字列(デフォルト)は、注釈が付けられたフィールドの名前を使用しようとします。

于 2017-11-08T15:50:12.760 に答える