2012-08-23 29 views
6

Jackson 2'yi kullanarak, tek bir değer olarak nesneleri serileştirmek için jenerik yolunu arıyorum (daha sonra tekrar tek bir alana yerleştirerek bunları tekrar serileştirin) Her davayı ele almak için bir JsonSerializer/JsonDeserializer oluşturun. @JsonIdentityInfo ek açıklamaları oldukça yakındır, ancak işaretini bildiğim kadarıyla gözden kaçırır, her zaman tam olarak ilk nesnedeki nesneyi serileştirir.Jackson - seriyi JSON değeri olarak serileştirme/deserialize edin

Yapmak istediklerimin bir örneği. sınıflar Verilen: @JsonIdentityInfo ne yapar

{"orderNum":"11111", "customer":"99"} 
{"orderNum":"11111", "customer":{"id":99}} 

daha zor istemcide başa yapar:

class Customer { 

    Long id = 99; 
    String name = "Joe"; 
    // Lots more properties 
} 

class Order { 
    String orderNum = "11111" 
    @WhateverAnnotationsINeedHereToDoWhatIWant 
    Customer customer; 
} 

ben Sipariş (Bana da mükemmel kabul olurdu) ya kadar seri hale getirmek istiyoruz -uzun (müşterinin müşteri kimliğini tam müşteri bilgisine nasıl eşleyeceğini bildiğini varsayabiliriz).

@JsonIgnoreProperties de gösterilen ikinci JSON için oldukça yakın gelebilir, ancak her şeyi hariç olmak istiyorum ama istediğim anlamına gelirdi.

Geri dönüşümü geri döndüğümde, yalnızca Müşterinin yalnızca "id" alanı ile başlatılmasını istiyorum.

Bunu, Jackson'ın geleneksel iç çamaşırlarına girmeden kaçırdığım herhangi bir sihir yolu var mı? Anlayabildiğim kadarıyla, JsonDeserializer/JsonSerializer ebeveyn hakkında hiçbir bağlamsal bilgiye sahip değil. Bu yüzden, bir @JsonValueFromProperty ("id") tipi Jackson Mix-in oluşturmanın kolay bir yolu yok gibi görünüyor. özel seri hale getirici/deserializer.

Herhangi bir fikir büyük takdir. Teşekkürler!

cevap

8

Bir keresinde farklı türden istek başına verilen JSON üzerinde ince ayarlı bir kontrole ihtiyacım vardı ve korkarım ki, Özel Serileştiriciler ve Desperizatörler kullanmaya başladım.

basit bir alternatifi Düzenin Müşteri alanına @JsonIgnore ekleme ve Sipariş için aşağıdaki gaz giderici ekleyin olurdu:

@JsonProperty("customer") 
public Long getCustomerId(){ 
    if (customer != null){ 
    return customer.getId(); 
    } 
    else { 
    return null; 
    } 
} 

JSON sonra olacağını döndürdü:

{"orderNum":"11111", "customer":"99"} 
+0

Teşekkürler Entegre Şeyler! Bu basit çözüm aslında benim için oldukça çalışkan görünüyor ve şu anda korkunç görünüyor;). Bir @JsonIgnorePropertiesExcept ("id") notunun yokluğunda, bunun iyi olacağını düşünüyorum. – jonc

4

başka olasılık olabilir Kimlik alanında kullanılan @JsonValue kullanın.

Jackson 2.1, güç referansının bile serileştirilmesini zorlamak için bir özellik ekleyecektir (@JsonIdentityInfo için yeni özellik, "firstAsId"). Bu, tüm durumlar için serileştirme ile iyi çalışmayabilir, ancak belki de sizin için çalışır.

+0

Teşekkürler StaxMan. Maalesef @JsonValue problemi çözmüyordu, çünkü sadece müşteriyi sadece serileştiriyor olsaydım, rekorun tamamen serileştirilmesini beklerdim. – jonc

+1

Tamam. En iyi bahsiniz daha sonra Jackson 2.1'dir - bu, türün serileştirilmesinden (her zaman kimliği kullanan) referansların ayrılmasına izin verecektir. – StaxMan

+4

Nihayet, Ekim ayında piyasaya çıktığı için 2.1'i denemek için :)[email protected] (alwaysAsId = true) ve @JsonIdentityInfo (generator = "generator = ObjectIdGenerators.PropertyGenerator.class"), Serileştirme sonundan çok iyi çalışır, ancak Object ID referansını çözemediği için serileştirme zamanı geldiğinde çok iyi değildir. . JPA sağlayıcıları ile sadece boş bir nesneyi ortaya çıkarmak ve sadece serileştirme için kimliğini ayarlamak için çalışacaklardı, ancak jackson serpantininiz için olası her bir referans tipi – jonc

İlgili konular