JSON stili özellik adlarını GSON ile Java CamelCase adlarına dönüştürün


107

Aldığım JSON verilerini bir Java nesnesine dönüştürmek için GSON kullanıyorum . Tüm testlerimde oldukça iyi çalışıyor. Sorun, gerçek nesnelerimizin is_online gibi bazı özelliklere sahip olmasıdır. GSON, yalnızca tamamen eşit olarak adlandırılırlarsa bunları eşler, GSON'un adları Java camel case isOnline'a dönüştürmesi iyi olur.

JSON verisi oluşturulurken bu mümkün görünüyor, deve durumu JSON'da alt çizgi ayrımlı kelimelere dönüştürülüyor. Ama bunu tam tersi şekilde belirtmenin bir yolunu bulamıyorum.


5
Bir cevabı kabul etmeyi
öneririm

Yanıtlar:


313

Modellerimde altı çizili özniteliklerle json okurken ve camelcasing kullanırken aşağıdaki ayarın mükemmel çalıştığını gördüm.

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

2
Harika cevap, teşekkürler! @janusz, bu cevaplardan herhangi biri size yardımcı olduysa, lütfen bunları Kabul Edilen Cevap olarak işaretleyin.
sufinawaz

1
Adın iki alt çizgi içerdiği bir durumunuz varsa, ilk alt çizgiyi yok sayar. Örn. this_key_has__two_underscores, thisKeyHas_TwoUnderscores'a dönüştürülecek ve aynısı bunun tersi de geçerlidir. Anahtar nokta, numaralamanın alt çizgilerle "küçük harf" dediği FieldNamingPolicy'dir, burada dönüştürülen adın alt çizgiyle (_T) bir büyük harf vardır.
Deepak GM

Çok basit, beni bir grup alana açıklama eklemekten kurtarıyor!
William T. Mallard

99

SerializedNameEk açıklamayı kullanabilirsiniz :

@SerializedName("field_name_in_json")
private final String fieldNameInJava;

Not: FieldNamingPolicyZaten bir ayarladığınızda , SerializedNameo belirli alan için ayarlarının üzerine yazılır (özel durumlar için oldukça kullanışlıdır).


2

Örneğinizin uç bir durum olduğunu unutmayın. Bir 'foo' özelliğiniz varsa, alıcısı 'getFoo' olarak adlandırılmalıdır ve 'foo_bar' adlı bir özelliğiniz varsa, alıcısı 'getFooBar' olarak adlandırılmalıdır, ancak sizin örneğinizde bir boole eşleştiriyorsunuz ve mantıksallar java'da özel durum adlandırma kuralları. Çevrimiçi olarak adlandırılan ilkel bir boole özelliği, "isOnline", "getOnline" DEĞİL veya daha da kötüsü "getIsOnline" adlı bir alıcıya sahip olmalıdır. Bir boole sarmalayıcı nesnesi (yani Boolean) bu özel durumu izlememelidir ve 'çevrimiçi' adlı bir özellik, 'getOnline' adında bir alıcıya sahip olmalıdır.

Bu nedenle, adında 'is' olan boole özelliklerine sahip olmak, dönüştürme sırasında bu belirli öneki çıkarmak isteyeceğiniz bir uç durumdur. Ters yönde, kodunuz json nesnesini hem ham özellik adı hem de 'is_XXX' sürümü için incelemek isteyebilir.


2

Sanırım istediğin burada . Ek açıklamaları kullanarak, GSON'a mySuperCoolField'ın JSON'da this_field_is_fun olarak adlandırıldığını ve doğru bir şekilde paketini açacağını söyleyebilirsiniz. En azından serileştirme için de işe yaradığını düşünüyorum.

Bu işe yaramazsa, harika çalışan özel JsonSerializer / JsonDeserializers kullanabilirsiniz, ancak sınıfınızdaki değişiklikler için bunları güncellemeniz gerekir (bir alan eklediğinizde olduğu gibi). Otomatik büyüyü kaybedersiniz.

Yapılması en kolay şey (ki bu çirkin olurdu, ancak ilk öneri işe yaramazsa çok temiz ve basit olurdu), alanı GSON'u mutlu edecek şekilde adlandırmak ve beğendiğiniz adlarla ekstra erişimci yöntemleri eklemek olacaktır. , Örneğin

public boolean isXXX() {return this.is_XXX;}

kolay olan şey şu anda yaptığım şey ve gayet iyi çalışıyor. Tüm çirkin, tipik olmayan java tarzı kodlar veri sınıflarında gizlidir ve dışarıdan kimse görmez. Ama yine de beni biraz
rahatsız ediyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.