2012-06-14 8 views
16

मेरे पास Item कक्षा है। उस श्रेणी के अंदर itemType फ़ील्ड है जो कि टाइपटाइप प्रकार है।जैक्सन को ऑब्जेक्ट के बजाय ऑब्जेक्ट के अंदर किसी फ़ील्ड को क्रमबद्ध करने का निर्देश कैसे दें?

मोटे तौर पर, ऐसा कुछ।

class Item 
{ 
    int id; 
    ItemType itemType; 
} 

class ItemType 
{ 
    String name; 
    int somethingElse; 
} 

जब मैं प्रकार Item का एक उद्देश्य जैक्सन ObjectMapper का उपयोग कर serializing कर रहा हूँ, यह एक उप-वस्तु के रूप में वस्तु ItemType serializes। जो उम्मीद की जाती है, लेकिन जो मैं चाहता हूं वह नहीं।

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

मैं करना चाहते हैं क्या जब धारावाहिक बजाय itemType के name क्षेत्र को दिखाने के लिए है।

कुछ नीचे जैसा है।

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

क्या जैक्सन को ऐसा करने के निर्देश देने के लिए वैसे भी है?

उत्तर

14

आपको 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

धन्यवाद! यह पूरी तरह से काम किया! :) –

+0

यह काम करता है। और पूर्णता के लिए, एक संबंधित संभावना 'आइटम टाइप' को 'जेसनसेरियलज़ेबल' लागू करने के लिए है (विधि "धारावाहिक()")। – StaxMan

+0

मुझे नहीं पता कि मैं सीरियलाइज़र को एक आंतरिक कक्षा के रूप में क्यों घोषित नहीं कर सकता, यह मुझे एक त्रुटि दे रहा है। –

1

शायद एक त्वरित समाधान का Item पर एक अतिरिक्त गेटर जोड़ने ItemType.name वापस जाने के लिए, और @JsonIgnore साथ ItemType गेटर चिह्नित करने के लिए है?

15

@JsonValue एनोटेशन देखें।

संपादित करें: इस तरह:

class ItemType 
{ 
    @JsonValue 
    public String name; 

    public int somethingElse; 
} 
+3

यह समझाने की देखभाल करें कि यह मेरी समस्या का समाधान कैसे करेगा? :) –

+1

प्रश्न था "जैक्सन को ऑब्जेक्ट के बजाय किसी ऑब्जेक्ट के अंदर किसी क्षेत्र को क्रमबद्ध करने के लिए कैसे निर्देश देना है?" और यह '@ JsonValue' के साथ कहा गया फ़ील्ड एनोटेट करके किया जाता है। – StaxMan

+1

यह मूल प्रश्न का सबसे अच्छा जवाब है हालांकि pingw33n का उत्तर वास्तव में मेरी स्थिति में मदद करता है जो मूल प्रश्न से थोड़ा अलग था – Kirby

2

ओपी केवल एक क्षेत्र को क्रमानुसार करने चाहता है के रूप में, आप भी @JsonIdentityInfo और @JsonIdentityReference एनोटेशन इस्तेमाल कर सकते हैं:

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

अधिक जानकारी के लिए, How to serialize only the ID of a child with Jackson देखते हैं।

+0

मुझे लगता है कि यह स्वीकार्य उत्तर होना चाहिए। यह बहुत आसान है और ओपी की समस्या को और अधिक सुन्दरता से हल करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे