2011-01-07 15 views
22

Gson'u kullanarak bir nesneyi serileştirirken sorun yaşıyorum.Gson, kök değeri dahil olan POJO'yu seri hale getiriyor mu?

@XmlRootElement 
class Foo implements Serializable { 
    private int number; 
    private String str; 

    public Foo() { 
     number = 10; 
     str = "hello"; 
    } 
} 

GSON bir JSON

{"number":10,"str":"hello"} içine bu seri hale getirilmeye.

Ancak, ben o kadar temelde üst düzey elemanı olmak üzere

{"Foo":{"number":10,"str":"hello"}},

olmak istiyorum. Google'da bunu Gson'da yapmanın bir yolunu denedim, ancak şans yok. Bunu başarmanın bir yolu olup olmadığını bilen var mı?

Teşekkürler!

cevap

19

Öğeyi, nesne ağacının en üstüne eklemeniz gerekir. Böyle bir şey:

Gson gson = new Gson(); 
JsonElement je = gson.toJsonTree(new Foo()); 
JsonObject jo = new JsonObject(); 
jo.add("Foo", je); 
System.out.println(jo.toString()); 
// Prints {"Foo":{"number":10,"str":"hello"}} 
+2

, bu ihtiyacım demektir Yine de "Foo" sınıf tipini elemanın içine kodlamak için. – fei

+0

@fei yes. İdeal olarak, Gson'dan aldığınız doğrudur. JSON'daki 'Foo' nesnesinin doğru gösterimi '{"sayı": 10, "str": "merhaba"} 'dır. Eğer bu durumda örnek değişken olarak Foo olan bir sınıf varsa, "{" foo ": {" number ": 10," str ":" hello "}}' beklemeniz gerekirdi, ancak eğer isterseniz sınıf adı açıkça, açıkça eklemeniz gerekecek. – Nishant

15

yerine türünü hardcoding yapabileceğiniz:

... 
jo.add(Foo.getClass().getSimpleName(), je); 
+2

Bu bence diğer cevabın bir yorumu olmalı ve kendi başına bir cevap olmamalı. Bu aslında iyi bir yorum – mbritto

-1

Jackson api, gerçek aşağıda çizgileri

mapper.configure (SerializationFeature.WRAP_ROOT_VALUE kullanmak kullanıyorsanız); mapper.configure (DeserializationFeature.UNWRAP_ROOT_VALUE, true);

+0

soru devletin operasyonun başlığı GSON kullanıyor ve jackson değil – dstarh

6

yapmak için daha iyi bir yol, bir sarma sınıf oluşturmak ve daha sonra bunun içine Foo bir nesne oluşturmaktır.

örnek kod: Sonra

public class ResponseWrapper { 

    @SerializedName("Foo") 
    private Foo foo; 

    public Foo getFoo() { 
     return foo; 
    } 

    public void setFoo(Foo foo) { 
     this.foo= foo; 
    } 
} 

kolayca kullanarak JSON için ayrıştırabilirsiniz:

new GsonBuilder().create().toJson(responseWrapperObj); 

size arzu edilen yapıyı verecek olan: iyi

{"Foo":{"number":10,"str":"hello"}} 
+0

Bu çok daha iyi bir yanıt. –

+0

Gerçekten de, başka bir nesne yaratıyorsunuz… 3 modelli küçük bir uygulamada bu iyi, ama 40'dan fazla kal ve bu sarmalayıcıları yaz… –

İlgili konular