2011-01-07 9 views
22

मुझे जीसन का उपयोग करके ऑब्जेक्ट को क्रमबद्ध करने में समस्या आ रही है।जीएसओ रूट मूल्य के साथ POJO serialize शामिल?

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

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

Gson एक JSON

{"number":10,"str":"hello"} में इस क्रमानुसार होगा।

हालांकि, मैं यह

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

तो मूल रूप से उच्च स्तर घटक सहित होना चाहता हूँ। मैंने जीसन में ऐसा करने के लिए एक रास्ता तय करने की कोशिश की, लेकिन कोई भाग्य नहीं। किसी को पता है कि यह हासिल करने का कोई तरीका है या नहीं?

धन्यवाद!

उत्तर

19

आपको ऑब्जेक्ट पेड़ के शीर्ष पर तत्व जोड़ने की आवश्यकता है। कुछ इस तरह: प्रकार हार्डकोड की

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

अच्छी तरह से, इसका मतलब है मैं की जरूरत है हालांकि तत्व में वर्ग प्रकार "फू" हार्डकोड करने के लिए। – fei

+0

@fei हां। आदर्श रूप से, आप जीसन से क्या प्राप्त कर रहे हैं सही है। जेएसओएन में 'फू' ऑब्जेक्ट का सही प्रतिनिधित्व '{" संख्या "है: 10," str ":" हैलो "}'। यदि ऐसी कक्षा है जिसमें फू को उस मामले में आवृत्ति चर के रूप में रखा गया है तो आपको '{" foo ": {" number ": 10," str ":" hello "}} की उम्मीद करनी चाहिए थी - लेकिन यदि आप प्रीपेड करना चाहते हैं कक्षा का नाम स्पष्ट रूप से, आपको इसे स्पष्ट रूप से जोड़ना होगा। – Nishant

15

इसके बजाय आप कर सकते हैं:

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

मुझे लगता है कि यह अन्य उत्तर की टिप्पणी होनी चाहिए, न कि स्वयं का जवाब। यह वास्तव में एक अच्छी टिप्पणी है हालांकि – mbritto

-1

आप जैक्सन एपीआई नीचे लाइनों

mapper.configure (SerializationFeature.WRAP_ROOT_VALUE उपयोग करते हैं, सही उपयोग कर रहे हैं); mapper.configure (DeserializationFeature.UNWRAP_ROOT_VALUE, सत्य);

+0

प्रश्न राज्य के ओप का शीर्षक जीएसओएन का उपयोग कर रहा है और जैक्सन – dstarh

6

ऐसा करने का एक बेहतर तरीका एक रैपर वर्ग बनाना है और फिर इसके अंदर Foo का ऑब्जेक्ट बनाना है।

नमूना कोड:

public class ResponseWrapper { 

    @SerializedName("Foo") 
    private Foo foo; 

    public Foo getFoo() { 
     return foo; 
    } 

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

तो आप आसानी से उपयोग कर रहा JSON को पार्स कर सकते हैं:

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

जो आप इच्छित संरचना दे देंगे:

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

यह एक बेहतर प्रतिक्रिया है। –

+0

वास्तव में, आप एक और वस्तु बना रहे हैं ... 3 मॉडल के साथ एक छोटे से ऐप में यह ठीक है, लेकिन 40+ बनाए रखें और इन रैपर को लिखें ... –