2012-04-20 28 views
6

Tôi nghĩ Jackson thực hiện tuần tự dựa trên phương thức, có cách nào tôi có thể làm cho trường đó dựa trên không?Serialization dựa trên trường Jackson

Ex:

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 
} 

Sản lượng JSON có "i" và "Seti". Có anyway tôi có thể ghi đè lên điều này để có được chỉ "tôi"? Ngoài ra nó sẽ là tuyệt vời nếu có một cách để làm điều này mà không cần thêm bất kỳ chú thích cho lớp (chúng được tự động tạo ra).

+1

Mã này không biên dịch. Bạn có thể đăng mã thực tế bạn đang sử dụng cũng như bạn đang cố gắng sắp xếp theo thứ tự như thế nào? –

Trả lời

5

Để thực hiện điều này mà không cần chú thích, bạn có thể cấu hình các ObjectMapper trước serializing/deserializing theo cách sau đây:

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

Jackson cũng có thể sử dụng các trường, vâng; nhưng theo mặc định, chỉ các trường công khai mới được phát hiện. Nhưng bạn có thể sử dụng @JsonProperty để đánh dấu các trường không công khai.

Một điều cần lưu ý là nếu có cả phương thức (setX, getX) và trường (x), phương thức sẽ được ưu tiên. Điều này thường không phải là một vấn đề, nhưng nếu nó là, bạn cần phải rõ ràng sau đó vô hiệu hóa phương pháp (s) mà không được sử dụng, bằng cách thêm @JsonIgnore enxt cho họ.

10

Xem chú thích @JsonAutoDetect. Ví dụ:

@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 
} 
3

Câu trả lời được chấp nhận không đạt được kết quả mong đợi đối với tôi. Điều gì làm việc cho tôi mà không cần thêm chú thích là cấu hình ObjectMapper theo cách sau:

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

Đây là cách mà dường như có ý nghĩa hơn đối với tôi, trong đó sử dụng các lĩnh vực thay vì thu khí \ setters như tiêu chuẩn serialization Java sẽ làm.

Các vấn đề liên quan