2013-10-24 8 views
6

बाकी सेवाजैक्सन जड़ unwraping साथ json पार्स, लेकिन @JsonRootName

<transaction><trxNumber>1243654</trxNumber><type>INVOICE</type></transaction> 

साथ या JSON प्रतिक्रिया निर्धारित करने की क्षमता के बिना:

{"transaction":{"trxNumber":1243654,"type":"INVOICE"}} 

वहाँ कोई समस्या नहीं है जब मैं का उपयोग करें:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) 

और जिसके परिणामस्वरूप वर्ग के रूप में

@JsonRootName("transaction") 
public class Transaction { 
private String trxNumber; 
private String type; 
//getters and setters 
} 

लेकिन वास्तव में मुझे तीसरे पक्ष के जार से लेनदेन वर्ग का उपयोग करना चाहिए, जो ऊपर की तरह सटीक है, लेकिन इसमें कोई @JsonRootName ("लेनदेन") एनोटेशन नहीं है।

तो मैं

Could not read JSON: Root name 'transaction' does not match expected ('Transaction') for type... 

अंत वहाँ लेनदेन वर्ग खुद के लिए किसी भी सामान को जोड़े बिना जैक्सन लेनदेन वर्ग के लिए पार्स मजबूर करने के लिए किसी भी तरीके है (के रूप में मैं इस फाइल एक द्विआधारी जार के हिस्से के रूप मिलता है) ?

मैंने कस्टम PropertyNamingStrategy की कोशिश की है, लेकिन ऐसा लगता है कि केवल फ़ील्ड और गेटर/सेटर नामों के साथ ही नहीं, बल्कि वर्ग के नाम हैं।

जावा 7, जैक्सन 2.0.5।

कोई सुझाव? धन्यवाद।

उत्तर

5

आप इसे mixin सुविधा के साथ कर सकते हैं। अब

@JsonRootName("transaction") 
interface TransactionMixIn { 

} 

, आप ObjectMapper वस्तु को कॉन्फिगर करना:: आप इस तरह सरल अंतरफलक/सार वर्ग बना सकते हैं

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
mapper.addMixInAnnotations(Transaction.class, TransactionMixIn.class); 

और अंत में आप JSON deserialize के लिए इसका इस्तेमाल कर सकते हैं:

mapper.readValue(json, Transaction.class); 

दूसरा विकल्प - आप custom deserializerTransaction कक्षा के लिए लिख सकते हैं।

+1

बढ़िया! उत्तर के लिए बहुत बहुत धन्यवाद। आखिरकार हमने ट्रांज़ेक्शनवापर ऑब्जेक्ट के साथ जाने और अपने लेनदेन क्षेत्र पर @ जेसन रूट नाम ("लेनदेन") डाला, लेकिन आपका सुझाव बहुत दिलचस्प लग रहा है! –

+0

'ट्रांज़ेक्शनवापर' अच्छा लगता है। मैंने इसके बारे में भी सोचा। वैसे भी आप भविष्य में एक और समस्या को हल करने के लिए मिश्रित सुविधा का पुन: उपयोग कर सकते हैं। –

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