2012-06-14 22 views
16

Tôi có một lớp học Item. Có một trường itemType bên trong lớp đó thuộc loại ItemType.Làm thế nào để hướng dẫn Jackson sắp xếp một trường trong một Object thay vì Object nó?

gần giống như thế này.

class Item 
{ 
    int id; 
    ItemType itemType; 
} 

class ItemType 
{ 
    String name; 
    int somethingElse; 
} 

Khi tôi serializing một đối tượng kiểu Item sử dụng Jackson ObjectMapper, nó serializes đối tượng ItemType như một sub-object. Đó là dự kiến, nhưng không phải những gì tôi muốn.

{ 
    "id": 4, 
    "itemType": { 
    "name": "Coupon", 
    "somethingElse": 1 
    } 
} 

Những gì tôi muốn làm là để hiển thị name lĩnh vực này 's itemType thay vì khi serialized.

Thứ gì đó như dưới đây.

{ 
    "id": 4, 
    "itemType": "Coupon" 
} 

Có cách nào hướng dẫn Jackson làm như vậy không?

Trả lời

14

Bạn cần tạo và sử dụng custom serializer.

public class ItemTypeSerializer extends JsonSerializer<ItemType> 
{ 
    @Override 
    public void serialize(ItemType value, JsonGenerator jgen, 
        SerializerProvider provider) 
        throws IOException, JsonProcessingException 
    { 
     jgen.writeString(value.name); 
    } 

} 

@JsonSerialize(using = ItemTypeSerializer.class) 
class ItemType 
{ 
    String name; 
    int somethingElse; 
} 
+2

Cảm ơn bạn! Điều này làm việc hoàn hảo! :) –

+0

Tác phẩm này. Và vì lợi ích của sự hoàn chỉnh, một khả năng liên quan là làm cho 'ItemType' thực hiện' JsonSerializable' (phương thức "serialize()"). – StaxMan

+0

Tôi không biết tại sao tôi không thể khai báo Serializer là Lớp bên trong, nó vẫn cho tôi lỗi. –

1

Có lẽ một workaround nhanh chóng là thêm một getter thêm trên Item trở ItemType.name, và đánh dấu ItemType getter với @JsonIgnore?

15

Khám phá chú thích @JsonValue.

EDIT: như thế này:

class ItemType 
{ 
    @JsonValue 
    public String name; 

    public int somethingElse; 
} 
+3

Chăm sóc để giải thích cách điều này sẽ giải quyết được vấn đề của tôi? :) –

+1

Câu hỏi là "Làm thế nào để hướng dẫn Jackson sắp xếp một trường trong một Object thay vì Object nó?" và điều đó được thực hiện bằng cách chú thích trường đã nói với '@ JsonValue'. – StaxMan

+1

Đây là câu trả lời tốt nhất cho câu hỏi gốc mặc dù câu trả lời của pingw33n thực sự giúp tình huống của tôi hơi khác so với câu hỏi ban đầu ở đây – Kirby

2

Như OP chỉ muốn serialize một lĩnh vực, bạn cũng có thể sử dụng @JsonIdentityInfo@JsonIdentityReference chú thích:

class Item { 
    int id; 
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="name") 
    @JsonIdentityReference(alwaysAsId=true) 
    ItemType itemType; 
} 

Mọi chi tiết, thấy How to serialize only the ID of a child with Jackson.

+0

Tôi nghĩ rằng đây nên là câu trả lời được chấp nhận. Nó đơn giản hơn nhiều và giải quyết vấn đề của OP một cách tao nhã hơn. –

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