2013-10-24 22 views
6

dinlenme hizmetiJackson kökünü unwraping ile json ayrıştırmak, ama @JsonRootName

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

veya JSON yanıt verir belirleme yeteneği olmadan:

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

ı kullanırken hiç problem yoktur:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) 

Ve sonuçta ortaya çıkan sınıf olarak

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

Ancak aslında Transaction sınıfını yukarıdaki gibi olan 3. parti jar'undan kullanmalıyım, , ancak @JsonRootName ("transaction") ek açıklaması yoktur.

yüzden Jackson İşlem sınıfına ayrıştırmak zorlamak için herhangi bir yolu İşlem sınıfına kendisine herhangi bir şeyler eklemeden var mı

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

ile bitirmek (Ben bir ikili kavanoz bir parçası olarak bu dosyayı almak gibi) ?

Özel PropertyNamingStrategy denedim, ancak alan ve getter/setter isimleriyle değil, sınıf isimleriyle yapılması gerekiyor.

Java7, Jackson 2.0.5.

Herhangi bir öneriniz var mı? Teşekkürler.

cevap

5

mixin özelliği ile yapabilirsiniz. Böyle basit bir arayüz/soyut sınıf oluşturabilirsiniz:

@JsonRootName("transaction") 
interface TransactionMixIn { 

} 

Şimdi, ObjectMapper nesne yapılandırmak zorunda:

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

Ve nihayet sen JSON serisini kullanabilirsiniz:

mapper.readValue(json, Transaction.class); 

İkinci seçenek - Transaction sınıfı için custom deserializer yazabilirsiniz.

+1

Harika! Cevabınız için çok teşekkür ederim. Son olarak TransactionWrapper nesnesine gitmeye ve İşlem alanında @JsonRootName ("transaction") koymaya geçtik, ama öneriniz çok ilginç görünüyor! –

+0

'TransactionWrapper 'iyi geliyor. Bunu da düşündüm. Yine de gelecekte başka sorunları çözmek için mixin özelliğini yeniden kullanabilirsiniz. –

İlgili konular