2016-01-27 15 views
6

Hãy nói rằng tôi có một lớp học như thế này:Jackson. Deserialize tính thiếu như trống Tùy chọn

public static class Test { 

     private Optional<String> something; 

     public Optional<String> getSomething() { 
      return something; 
     } 

     public void setSomething(Optional<String> something) { 
      this.something = something; 
     } 

    } 

Nếu tôi deserialize JSON này, tôi nhận được một sản phẩm nào không bắt buộc:

{"something":null} 

Nhưng nếu sở hữu là mất tích (trong trường hợp này chỉ là JSON trống), tôi nhận được null thay vì Tùy chọn. Tôi có thể tự khởi tạo các trường, nhưng tôi nghĩ sẽ tốt hơn nếu có một cơ chế cho các thuộc tính rỗng và thiếu. Vì vậy, có cách nào để làm cho jackson deserialize tài sản bị thiếu như trống tùy chọn?

+0

Hình như cách thuận tiện để phân biệt giữa 'null' và giá trị vắng mặt đối với tôi –

Trả lời

3

Tùy chọn không thực sự có nghĩa là được sử dụng làm trường nhưng có giá trị trả về cao hơn. Tại sao không có:

public static class Test { 
    private String something; 
    public Optional<String> getSomething() { 
    return Optional.ofNullable(something); 
    } 
    public void setSomething(String something) { 
    this.something = something; 
    } 
} 
+1

oracle không nghĩ như vậy http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html – AdamSkywalker

+1

@AdamSkywalker phụ thuộc vào nguồn nào từ Oracle - những người đã làm việc trên API [dường như suy nghĩ khác] (http://stackoverflow.com/a/23464794/829571). – assylias

+0

ok, có vẻ như hợp pháp – AdamSkywalker

0

Đối với một giải pháp mà không getters/setters, hãy chắc chắn something được khởi tạo như thế này:

public Optional<String> something = Optional.empty(); 
Các vấn đề liên quan