2012-06-28 29 views
12

Tôi có aa bản đồ mà trông như thế này:deserializing không theo chuỗi phím bản đồ với Jackson

public class VerbResult { 
    @JsonProperty("similarVerbs") 
    private Map<Verb, List<Verb>> similarVerbs; 
} 

lớp động từ của tôi trông như thế này:

public class Verb extends Word { 
    @JsonCreator 
    public Verb(@JsonProperty("start") int start, @JsonProperty("length") int length, 
      @JsonProperty("type") String type, @JsonProperty("value") VerbInfo value) { 
     super(length, length, type, value); 
    } 
    //... 
} 

Tôi muốn serialize và deserialize trường hợp của tôi Lớp VerbResult, nhưng khi tôi gặp lỗi này: Can not find a (Map) Key deserializer for type [simple type, class my.package.Verb]

Tôi đọc trực tuyến bạn cần nói cho Jackson biết cách loại bỏ khóa bản đồ, nhưng tôi không tìm thấy bất kỳ thông tin nào giải thích cách để làm điều này. Lớp động từ cần phải được tuần tự hóa và deserialzed bên ngoài bản đồ là tốt, vì vậy bất kỳ giải pháp nên bảo toàn chức năng này.

Cảm ơn sự giúp đỡ của bạn.

+0

có bạn đọc http://stackoverflow.com/questions/6371092/can-not-find-a-map-key-deserializer-for-type -simple-type-class-com-comcast-i? Trường hợp của ông trông khá giống với trường hợp của bạn ngay từ cái nhìn đầu tiên. – fvu

+0

Có, tôi đã đọc điều đó, nhưng tôi đã không thực sự tìm thấy câu trả lời cho câu hỏi trong đó. Làm thế nào tôi có thể sử dụng một mô-đun để giải quyết vấn đề này? – Max

Trả lời

3

Xây dựng trên answer given here gợi ý để triển khai Mô-đun có bộ giải điều chế tôi tham khảo the Jackson Module documentation. Các JodaTime Module là một dễ hiểu ví dụ đầy đủ của một mô-đun có chứa serializers và deserializers.

Xin lưu ý rằng tính năng Mô-đun đã được giới thiệu trong phiên bản Jackson 1.7 nên bạn có thể cần phải nâng cấp.

Vì vậy, từng bước:

  1. tạo một module có chứa một (de) serializer cho lớp học của bạn dựa trên ví dụ Joda
  2. đăng ký rằng mô-đun với mapper.registerModule(module);

và bạn sẽ là tất cả các thiết lập

+0

Tuyệt vời!Cảm ơn bạn rất nhiều. – Max

+2

Một lưu ý bổ sung thêm: những gì bạn cần thêm là "serial (de) serializers": thường xuyên (de) serializers không thể được sử dụng như là, vì hạn chế bổ sung Các phím bản đồ có. Nhưng đăng ký có thể được thực hiện từ mô-đun cho chắc chắn. – StaxMan

+3

@Max Có thể bạn có thể cung cấp mã cho cách bạn triển khai trình gỡ rối không? Tôi muốn thấy rằng, nếu có thể =) – Ted

8

Như đã đề cập ở trên mẹo là bạn cần một khóa deserializer (điều này cũng bắt được tôi). Trong trường hợp của tôi, khóa bản đồ không phải String được cấu hình trên lớp của tôi nhưng nó không nằm trong JSON mà tôi đã phân tích để một giải pháp cực kỳ đơn giản làm việc cho tôi (chỉ trả về null trong trình khử khóa).

public class ExampleClassKeyDeserializer extends KeyDeserializer 
{ 
    @Override 
    public Object deserializeKey(final String key, 
            final DeserializationContext ctxt) 
     throws IOException, JsonProcessingException 
    { 
     return null; 
    } 
} 

public class ExampleJacksonModule extends SimpleModule 
{ 
    public ExampleJacksonModule() 
    { 
     addKeyDeserializer(
      ExampleClass.class, 
      new ExampleClassKeyDeserializer()); 
    } 
} 

final ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new ExampleJacksonModule()); 
13

Sau một ngày tìm kiếm, tôi đã thực hiện một cách đơn giản hơn để thực hiện dựa trên this question. Giải pháp là thêm chú thích @JsonDeserialize(keyUsing = YourCustomDeserializer.class) vào bản đồ. Sau đó, triển khai trình gỡ rối tùy chỉnh của bạn bằng cách mở rộng KeyDeserializer và ghi đè phương thức deserializeKey. Phương thức này sẽ được gọi bằng khóa chuỗi và bạn có thể sử dụng chuỗi để tạo đối tượng thực hoặc thậm chí tìm nạp một đối tượng hiện có từ cơ sở dữ liệu.

Vì vậy, lần đầu tiên trong tờ khai bản đồ:

@JsonDeserialize(keyUsing = MyCustomDeserializer.class) 
private Map<Verb, List<Verb>> similarVerbs; 

Sau đó tạo các deserializer sẽ được gọi với phím chuỗi.

public class MyCustomDeserializer extends KeyDeserializer { 
    @Override 
    public MyMapKey deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     //Use the string key here to return a real map key object 
     return mapKey; 
    } 
} 

trình với Jersey và Jackson 2.x

+0

Tôi đã cố gắng để đặt chú thích trên chính lớp học (trong trường hợp của bạn 'Verb') hơn là trên bản đồ khai báo. Bạn đã cứu tôi một số đầu gãi hơn, cảm ơn! – snappieT

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