2012-09-25 107 views
96

這個bean '國家':什麼時候使用@JsonProperty屬性,它用於什麼?

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

這裏需要註釋@JsonProperty:

public class State { 

    private boolean isSet; 

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

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

} 

是在使用AJAX '成功' 回調線發送?使用它的優點是什麼? 我想我可以刪除這個註釋而不會造成任何副作用。

https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations上閱讀關於此注意事項我不知道何時需要使用此功能?

+0

wiki.fasterxml.com鏈接斷開 – JohnK

回答

126

這是一個很好的例子。我使用它來重命名變量,因爲JSON來自.Net環境,其中屬性以大寫字母開頭。

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

這正確分析/從JSON:

"Parameter":{ 
    "Name":"Parameter-Name", 
    "Value":"Parameter-Value" 
} 
+0

能否字符串成員變量不能重命名爲他們正確的情況下,使公共字符串名稱;成爲公共字符串名稱; ? –

+7

是的,但是在Java環境中,它們使得它們與編碼標準不匹配。它更多的是我的書卷氣,一個真正的編碼問題,但它是一個真正的使用'@ JsonProperty'註釋的良好而簡單的例子。 – OldCurmudgeon

+0

這個註解是否可以用於'Double'類型的成員?我只是想知道如果類型必須是'String'或JSON支持的任何類型?難道是任何類型的?@OldCurmudgeon – Dreamer

9

沒有註釋,推斷屬性名稱(從JSON匹配)將被「套」,而不是 - 因爲似乎是意圖 - 「isSet」。這是因爲按照Java Beans規範,表單「isXxx」和「setXxx」的方法意味着有邏輯屬性「xxx」來管理。

24

我認爲OldCurmudgeon和StaxMan都是正確的,但這裏有一個簡單的例子回答你的答案。

@JsonProperty(name),通知Jackson ObjectMapper將JSON屬性名稱映射到帶註釋的Java字段名稱。

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

//where it gets mapped 
public static class Car { 
    @JsonProperty("Type") 
    public String type; 
} 
+0

類名是否應該與JSON的根元素相同。這不適合我。 – Pavan

20

以及爲了什麼,現在它的價值... 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註釋neeeded。然而,如果你也有一個方法在類

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

3

如你所知,這是所有關於序列化和淡化的對象。假設有一個目的:

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; 
} 
0

從JsonProperty的javadoc,

使用邏輯屬性的

定義名稱,即JSON對象字段名稱的屬性。如果值爲空字符串(這是默認值),將嘗試使用註釋字段的名稱。

0

至於除了其他的答案,如果您使用類@JsonCreator標註不具有一個無參數的構造函數@JsonProperty註釋是非常重要的。

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,因此傑克遜將使用此構造創建實例。但輸出是這樣的:

序列化:{ 「stringValue的」: 「ABCD」, 「myEnum」: 「FIRST」}

異常在 線程 「主要」 com.fasterxml.jackson.databind .exc.InvalidFormatException:不能 從字符串值 'stringValue的' 構建的 com.avl.mbdtool.verificationmodule.exceptiondocument.ClassToSerialize $實例MyEnum :值聲明枚舉 實例名稱不是一個:FIRST,SECOND,THIRD ]

但在構造函數中添加@JsonProperty註釋後:

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

反序列化是成功的:

序列化:{ 「myEnum」: 「第一」, 「stringValue的」:」 ABCD「}

的StringValue:ABCD

MyEnum:FIRST

相關問題