2013-12-11 23 views
11

के साथ मौजूदा जेसन स्ट्रिंग जोड़ना मेरे पास कुछ मनमानी जेसन युक्त एक स्ट्रिंग ऑब्जेक्ट है। (यानी थकाऊ स्ट्रिंग संयोजन से परहेज)जीसन

{ 
    version: 1, 
    content: >>arbitrary_json_string_object<< 
} 

मैं कैसे मज़बूती से मेरी json स्ट्रिंग इसे करने के लिए एक विशेषता के रूप में यह मैन्युअल रूप से निर्माण करने के लिए बिना जोड़ सकते हैं: मैं एक json वस्तु के अंदर यह रैप करने के लिए, इस तरह करना चाहते हैं?

class Wrapper { 
    int version = 1; 
} 

gson.toJson(new Wrapper()) 
// Then what? 

ध्यान दें कि जोड़ा json नहीं भाग निकले जाना चाहिए, लेकिन एक एक मान्य JSON इकाई के रूप में आवरण का हिस्सा हो, इस तरह:

{ 
    version: 1, 
    content: ["the content", {name:"from the String"}, "object"] 
} 

दिया

String arbitraryJson = "[\"the content\", {name:\"from the String\"}, \"object\"]"; 
+0

क्या आपने 'सामग्री' स्ट्रिंग फ़ील्ड जोड़ने का प्रयास किया है? मैं परिणाम देखने के लिए उत्सुक हूँ। – everton

+0

शायद सामग्री से बच निकलेगा। –

+0

क्या आपने अपनी समस्या का समाधान किया? – giampaolo

उत्तर

5

यह मेरा समाधान है:

Gson gson = new Gson(); 
    Object object = gson.fromJson(arbitraryJson, Object.class); 

    Wrapper w = new Wrapper(); 
    w.content = object; 

    System.out.println(gson.toJson(w)); 

जहाँ मैं अपनी Wrapper वर्ग बदल दिया है:

// setter and getters omitted 
public class Wrapper { 
    public int version = 1; 
    public Object content; 
} 

आप कस्टम serializer अपने Wrapper के लिए यदि आप छुपाना चाहते हैं लिख सकते हैं deserialization/serialization के विवरण।

2

आपको इसे पहले deserialize करने की आवश्यकता होगी, फिर इसे अपनी संरचना में जोड़ें और पूरी चीज को फिर से क्रमबद्ध करें। अन्यथा, रैपर में पूरी तरह से बचने वाली स्ट्रिंग में लपेटा गया JSON होगा।

{"foo": "bar"} 

और चाहते हैं कि उसे अपने Wrapper वस्तु में लिपटे, एक JSON कि इस तरह दिखता है, जिसके परिणामस्वरूप:

यह आपको एक स्ट्रिंग में निम्न होना मानते हुए है

{ 
    "version": 1, 
    "content": {"foo": "bar"} 
} 

यदि आपने ऐसा किया पहले deserialize नहीं, यह निम्न परिणाम होगा:

{ 
    "version": 1, 
    "content": "{\"foo\": \"bar\"}" 
} 
+0

नहीं, आपको नहीं करना होगा। आप मध्यस्थ 'जेसनऑब्जेक्ट' का उपयोग कर सकते हैं जो नीचे 'लिंक्ड ट्रीमैप' का उपयोग करता है। –

+0

@ सॉटिरियोसेलिमैनोलिस: मुझे नहीं लगता कि ऐसा लगता है कि ओपी हासिल करने की कोशिश कर रहा है।मैंने अपने इरादे को और स्पष्ट बनाने के लिए अपना जवाब संपादित किया। – jwueller

5

सरल, सह अपने बीन को JsonObject पर बदलें और एक संपत्ति जोड़ें।

Gson gson = new Gson(); 
JsonObject object = (JsonObject) gson.toJsonTree(new Wrapper()); 
object.addProperty("content", "arbitrary_json_string"); 
System.out.println(object); 

प्रिंट

{"version":1,"content":"arbitrary_json_string"} 
+0

क्या यह काम करता है यदि '" arbitrary_json_string "' JSON * ऑब्जेक्ट * है? –

+1

@LutzHorn आप इसके लिए 'JsonObject # add (JsonElement)' का उपयोग कर सकते हैं। –

1

आप पूरे JSON संरचना के बारे में परवाह नहीं है, तो आप एक आवरण का उपयोग करने की जरूरत नहीं है। आप इसे जेनेरिक जेसन ऑब्जेक्ट में deserialize कर सकते हैं, और उसके बाद नए तत्व भी जोड़ सकते हैं।

JsonParser parser = new JsonParser(); 
JsonObject obj = parser.parse(jsonStr).getAsJsonObject(); 
obj.get("version"); // Version field 
7

इस विषय पर आने वाले लोगों के लिए, this पर विचार करें।

A a = getYourAInstanceHere(); 
Gson gson = new Gson(); 
JsonElement jsonElement = gson.toJsonTree(a); 
jsonElement.getAsJsonObject().addProperty("url_to_user", url); 
return gson.toJson(jsonElement); 
संबंधित मुद्दे