2011-04-18 30 views
8

Cách tốt nhất và dễ nhất để tạo hạt đậu theo cách tùy chỉnh (không phải bằng cách gọi hàm dựng mặc định) trong khi deserializing từ JSON bằng cách sử dụng thư viện Jackson? Tôi thấy rằng có giao diện JsonDeserializer mà tôi có thể triển khai nhưng tôi không chắc chắn cách kết nối tất cả với nhau thành ObjectMapper.Làm thế nào để nhanh chóng đậu theo cách tùy chỉnh với Jackson?

CẬP NHẬT # 1: Tôi nghĩ rằng một số chi tiết khác là bắt buộc đối với câu hỏi của tôi. Theo mặc định, deserializer của Jackson sử dụng hàm tạo mặc định cho các hạt đậu. Tôi muốn có thể thực hiện instantiation của đậu bằng cách gọi nhà máy bên ngoài. Vì vậy, những gì tôi cần chỉ là một lớp đậu cần được khởi tạo. Nhà máy sẽ trả lại bản sao mà sau đó có thể được cung cấp cho Jackson cho dân số bất động sản và vân vân.

Xin lưu ý rằng tôi không quan tâm đến việc tạo các giá trị đơn giản/vô hướng như chuỗi hoặc số, chỉ các hạt đậu trong khu vực mà tôi quan tâm.

Trả lời

0

Bạn đặt deserializer trên đối tượng Java mà bạn muốn để có được các json ánh xạ vào:

@JsonDeserialize(using = PropertyValueDeserializer.class) 
public class PROPERTY_VALUE implements Serializable{ 

và sau đó trong deserializer bạn có thể ví dụ làm:

@Override 
public PROPERTY_VALUE deserialize(JsonParser jsonParser, 
        DeserializationContext deserializationContext) 
      throws IOException, JsonProcessingException { 

    String tmp = jsonParser.getText(); // { 
    jsonParser.nextToken(); 
    String key = jsonParser.getText(); 
    jsonParser.nextToken(); 
    String value = jsonParser.getText(); 
    jsonParser.nextToken(); 
    tmp = jsonParser.getText(); // } 

    PROPERTY_VALUE pv = new PROPERTY_VALUE(key,value); 
    return pv; 
} 

Nếu bạn không muốn sử dụng các chú thích, bạn cần phải vượt qua mapper một DeserializerProvider có thể cung cấp các deserializer phù hợp với một loại nhất định.

mapper.setDeserializerProvider(myDeserializerProvider); 

Đối với các nhà thầu - dĩ nhiên bạn có thể tạo ra các lớp đối tượng bằng cách gọi một nhà máy trong deserializer:

String value = jsonParser.getText(); 
    jsonParser.nextToken(); 
    tmp = jsonParser.getText(); // } 

    MyObject pv = MyObjectFactory.get(key); 
    pv.setValue(value); 
    return pv; 
} 

Nhưng sau đó tôi có thể đã hiểu lầm cập nhật của bạn

+0

Cảm ơn Heiko. Theo mặc định, Jackson sử dụng hàm tạo mặc định của một bean để tạo cá thể. Những gì tôi muốn làm là để thực sự tạo ra các bean bằng cách sử dụng nhà máy bên ngoài. Tôi sẽ cập nhật câu hỏi của tôi với một số chi tiết trong một giây. –

+0

Tôi có thể làm gì mà không cần sử dụng chú thích? –

+1

Bằng cách sử dụng các chú thích kết hợp, các chú thích này không cần phải được thêm trực tiếp vào chính lớp đó mà là các lớp "kết hợp" khác. Điều này làm cho nó có thể sử dụng cách tiếp cận chú thích với libs của bên thứ ba. – StaxMan

8

Một số điều mà có thể help ...

Trước tiên, bạn có thể sử dụng @JsonCreator để xác định hàm tạo thay thế để sử dụng (tất cả đối số phải được chú thích bằng @JsonProperty vì bytecode có không có tên), hoặc một nhà máy tĩnh. Nó vẫn sẽ là một phần của lớp giá trị, nhưng có thể giúp hỗ trợ các đối tượng bất biến.

Thứ hai, nếu bạn muốn thực sự quá trình deserialization tùy chỉnh, bạn có thể kiểm tra http://wiki.fasterxml.com/JacksonHowToCustomDeserializers giải thích cách đăng ký deserializers tùy chỉnh.

Một điều mà Jackson hiện đang bỏ lỡ là hỗ trợ cho các đối tượng kiểu xây dựng; có một yêu cầu tính năng để thêm hỗ trợ (và kế hoạch là thêm hỗ trợ trong tương lai khi các nhà phát triển có thời gian).

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