2012-09-25 9 views
96

đậu này 'nhà nước':Khi nào thuộc tính @JsonProperty được sử dụng và nó được sử dụng để làm gì?

public class State { 

    private boolean isSet; 

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

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

} 

được gửi qua dây sử dụng 'thành công' các ajax callback:

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

Là @JsonProperty chú thích cần thiết ở đây? Lợi thế của việc sử dụng nó là gì? Tôi nghĩ rằng tôi có thể xóa chú thích này mà không gây ra bất kỳ tác dụng phụ nào.

Đọc về phụ đề này trên https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Tôi không biết khi nào điều này là bắt buộc để được sử dụng?

+0

liên kết wiki.fasterxml.com bị hỏng – JohnK

Trả lời

126

Đây là một ví dụ điển hình. Tôi sử dụng nó để đổi tên biến vì JSON đến từ một môi trường .Net nơi các thuộc tính bắt đầu bằng một chữ cái viết hoa.

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

này một cách chính xác phân tích đến/từ các JSON:

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

Các biến thành viên chuỗi có thể không được đổi tên thành trường hợp chính xác của chúng, vì vậy tên chuỗi công khai; trở thành Tên chuỗi công khai; ? –

+7

Có thể, nhưng trong một môi trường Java làm cho chúng không khớp với các tiêu chuẩn mã hóa. Đó là nhiều hơn về pedantry của tôi rằng một vấn đề mã hóa thực sự nhưng nó là một ví dụ tốt nhưng đơn giản của việc sử dụng thực sự của chú thích '@ JsonProperty'. – OldCurmudgeon

+0

Chú thích này có thể được sử dụng cho thành viên thuộc loại 'Double' không? Tôi chỉ tự hỏi liệu kiểu này có phải là 'String' hay bất kỳ kiểu nào mà JSON hỗ trợ không? Có thể là bất kỳ loại nào không? @OldCurmudgeon – Dreamer

9

Nếu không có chú thích, tên thuộc tính suy ra (để phù hợp với từ JSON) sẽ được "thiết lập", và không - như có vẻ là ý định - "isSet". Điều này là do theo đặc tả của Java Beans, các phương thức của biểu mẫu "isXxx" và "setXxx" được lấy để có nghĩa là có thuộc tính logic "xxx" để quản lý.

24

Tôi nghĩ OldCurmudgeon và StaxMan đều chính xác nhưng đây là câu trả lời một câu với ví dụ đơn giản cho bạn.

@JsonProperty (tên), yêu cầu Jackson ObjectMapper ánh xạ tên thuộc tính JSON cho tên của trường Java được chú thích.

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

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

Tên lớp phải giống với phần tử gốc của JSON. Điều này không làm việc cho tôi. – Pavan

20

để biết giá trị của nó ngay bây giờ ... JsonProperty C ALNG được sử dụng để chỉ định phương thức getter và setter cho biến ngoài việc tuần tự hóa và deserialization thông thường. Ví dụ giả sử bạn có một tải trọng như thế này:

{ 
    "check": true 
} 

và một lớp deserializer:

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

Sau đó, trong trường hợp này JsonProperty chú thích được neeeded. Tuy nhiên, nếu bạn cũng có một phương pháp trong lớp

public class Check { 

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

    public Boolean getCheck() { 
    return check; 
    } 
} 

Có xem xét tài liệu này quá: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html

3

Như bạn đã biết, đây là tất cả về serialize và desalinize một đối tượng. Giả sử có một đối tượng:

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

Các serialization của đối tượng này là:

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

Tên của biến được trực tiếp sử dụng để serialize dữ liệu. Nếu bạn sắp xóa api hệ thống khỏi việc triển khai hệ thống, trong một số trường hợp, bạn phải đổi tên biến trong tuần tự hóa/deserialization. @JsonProperty là một siêu dữ liệu để báo cho serializer biết cách nối tiếp đối tượng.Nó được sử dụng để:

  • tên biến
  • truy cập (đọc, viết)
  • giá trị mặc định
  • yêu cầu/tùy chọn

từ ví dụ:

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

Từ JsonProperty javadoc,

Xác định tên của thuộc tính hợp lý, tức là tên trường đối tượng JSON để sử dụng cho thuộc tính. Nếu giá trị rỗng Chuỗi (là mặc định), sẽ cố gắng sử dụng tên của trường được chú thích.

0

Ngoài các câu trả lời khác, chú thích @JsonProperty thực sự quan trọng nếu bạn sử dụng chú thích @JsonCreator trong các lớp không có hàm tạo no-arg.

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

Trong ví dụ này các nhà xây dựng chỉ được đánh dấu là @JsonCreator, do đó Jackson sẽ sử dụng constructor này để tạo ra các ví dụ. Nhưng sản lượng cũng giống như:

In nhiều: { "stringValue": "ABCD", "MyEnum": "FIRST"}

ngoại lệ trong chủ đề "chính" com.fasterxml.jackson.databind .exc.InvalidFormatException: không có thể xây dựng thể hiện của com.avl.mbdtool.verificationmodule.exceptiondocument.ClassToSerialize $ MyEnum từ string value 'stringValue': giá trị không nằm trong số tuyên bố Enum tên instance: [FIRST, SECOND, THIRD ]

Nhưng sau khi bổ sung các @JsonProperty chú thích trong các nhà xây dựng:

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

Các deserialization là thành công:

In nhiều: { "MyEnum": "FIRST", "stringValue":" ABCD "}

stringValue: ABCD

MyEnum: FIRST