POJO

2013-01-24 14 views
11

का उपयोग किए बिना जीएसओएन के साथ जेसन को संशोधित करें मैं इसे पीओजेओ में परिवर्तित किए बिना एक जेसन सामग्री को संशोधित करना चाहता हूं। मैं जीएसओएन लाइब्रेरी का उपयोग कर रहा हूं।POJO

String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]"; 

JsonElement jsonElement = gson.fromJson(jsonString, JsonElement.class);  

वहाँ किसी भी तरह से मैं कहाँ (कहते हैं कि "टेस्ट" है) कुछ मूल्य के लिए कुंजी 1 का मान सेट कर सकते हैं प्रत्येक सरणी में, POJO में

उत्तर

1
बातें परिवर्तित किए बिना है:

के बाद उपयोग के मामले हैं

एक दृष्टिकोण सिर्फ JSON को java.util.Map में परिवर्तित करने के लिए होगा, मानचित्र को संशोधित करें, और वहां से जाएं (जिसका अर्थ है कि मानचित्र को JSON पर वापस क्रमबद्ध करना)।

यह दृष्टिकोण सही नौकरी के लिए सही एपीआई के साथ काम करने के लिए मेरी वरीयता को पूरा करता है, जीसन जैसे उपकरणों के उपयोग को कम करने के लिए केवल सीरियलाइजेशन/deserialization (जो मैं समझता हूं कि इसे डिजाइन किया गया था) को संभालने के लिए कम करना। यही है, जीएसपी एपीआई को प्रतिस्थापन डेटा संरचना के रूप में उपयोग न करें।

+0

आप JSON को मानचित्र में कैसे परिवर्तित करेंगे? – linuxeasy

0

जीएसओएन में दो अलग-अलग एपीआई हैं (जिन्हें संयुक्त किया जा सकता है): एक का उपयोग क्रमबद्धता और deserialization के लिए किया जाता है, और दूसरा स्ट्रीमिंग के लिए किया जाता है। आप स्मृति भूमि के ऊपर के बिना या (बल्कि स्थिर POJOs से) गतिशील संरचनाओं का उपयोग कर आप कुछ की तरह कर सकते हैं JSON की धाराओं पर कार्रवाई करना चाहते हैं:

  • एक JsonWriter (मेरे उदाहरण में मैं StringWriter का उपयोग करें) बनाएँ;
  • एक जेसन रीडर बनाएं;
  • एक पाश कि पाठक से घटनाओं की खपत और लेखक के लिए उन्हें फ़ीड, जिससे बनाने परिवर्तन, परिवर्धन, चूक आदि

पाश एक भी स्विच बयान से मिलकर बनता है कि एक मामले होना आवश्यक है सब संभावित घटनाएं (उनमें से 10)। यहां तक ​​कि सबसे सरल उदाहरण में उनमें से सभी होना चाहिए, इसलिए नीचे दिया गया कोड वर्बोज़ दिखता है। लेकिन विस्तार करना बहुत आसान है और आगे के एक्सटेंशन इसे अधिक लंबे समय तक नहीं बनाएंगे।

एक उदाहरण है कि "परीक्षण" संलग्न कर देता है: 1 प्रत्येक वस्तु के लिए जोड़ी तरह दिखता है:

public class Whatever { 

static void streamandmodify(JsonReader reader, JsonWriter writer) throws IOException { 
    while (true) { 
     JsonToken token = reader.peek(); 
     switch (token) { 
     // most cases are just consume the event 
     // and pass an identical one to the writer 
     case BEGIN_ARRAY: 
      reader.beginArray(); 
      writer.beginArray(); 
      break; 
     case END_ARRAY: 
      reader.endArray(); 
      writer.endArray(); 
      break; 
     case BEGIN_OBJECT: 
      reader.beginObject(); 
      writer.beginObject(); 

      // this is where the change happens: 
      writer.name("test"); 
      writer.value(1); 
      break; 
     case END_OBJECT: 
      reader.endObject(); 
      writer.endObject(); 
      break; 
     case NAME: 
      String name = reader.nextName(); 
      writer.name(name); 
      break; 
     case STRING: 
      String s = reader.nextString(); 
      writer.value(s); 
      break; 
     case NUMBER: 
      String n = reader.nextString(); 
      writer.value(new BigDecimal(n)); 
      break; 
     case BOOLEAN: 
      boolean b = reader.nextBoolean(); 
      writer.value(b); 
      break; 
     case NULL: 
      reader.nextNull(); 
      writer.nullValue(); 
      break; 
     case END_DOCUMENT: 
      return; 
     } 
    } 
} 


public static void main(String[] args) throws IOException { 
    // just for test: 
    JsonReader jr = new JsonReader(new StringReader("{\"a\":1, \"b\":{\"c\":[1,2,3,{},{}]}}")); 
    StringWriter sw = new StringWriter(); 
    JsonWriter jw = new JsonWriter(sw); 
    streamandmodify(jr, jw); 
    System.out.println(sw.getBuffer().toString()); 
} 
} 
+0

जेसनवाइटर क्या कर सकता है इसका अच्छा उदाहरण, यह निश्चित रूप से है। लेकिन ओपी के कार्य के लिए, जेएसओएन ऑब्जेक्ट को अच्छी तरह से परीक्षण किए गए gson.fromJson() का उपयोग करने के बजाय स्ट्रीमिंग द्वारा फिर से बनाने का कोई कारण नहीं है। जेफ का जवाब देखें। – teejay

+0

@teejay: "कोई कारण नहीं"? आप कैसे जानते हैं? ऐसी टिप्पणी क्यों? मुझे कुछ गुण जोड़ने के लिए मनमाने ढंग से बड़े JSON दस्तावेज़ के पूरे इन-मेमोरी प्रस्तुति को न बनाने के कुछ अच्छे कारण मिल सकते हैं और कहें, पूरी चीज़ को फ़ाइल में वापस क्रमबद्ध करें। हम में से कोई भी सवाल के संदर्भ को नहीं जानता है, इसलिए दोनों स्ट्रीमिंग और डोमिनिश दृष्टिकोण बेहतर हो सकता है। – fdreger

+0

खैर, मुझे लगता है कि इस पृष्ठ पर आने वाले लोग अपनी समस्या को हल करना चाहते हैं - जेएसओएन को स्ट्रिंग से संशोधित करना है जो पहले से ही पूरी तरह से उपलब्ध है (= स्ट्रीमिंग के लिए कोई कारण नहीं है)। आपका उत्तर "काम करता है" लेकिन दूसरे संदर्भ में अधिक उपयुक्त होगा। कोई अपराध नहीं :) – teejay

0

jsonString एक सादे, साधारण जावा स्ट्रिंग है; ताकि आप इसे जो भी आप जावा के मानकों स्ट्रिंग कार्यों का उपयोग कर की तरह संशोधित करने और Test1 साथ-स्ट्रिंग key1 की जगह ले सकता:

jsonString = "[{\"key1\":\"Test\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]"; 
बेशक

, जावा में स्ट्रिंग हैं अपरिवर्तनीय तो यह एक StringBuilder करने के लिए पहले परिवर्तित संभवतः आप एक दे देंगे स्मृति उपयोग की अवधि में बेहतर प्रदर्शन।

+2

यह परीक्षण कोड में एक सभ्य-अगर-हैकी रणनीति है, लेकिन यदि मूल या स्ट्रिंग या प्रतिस्थापन उपयोगकर्ता द्वारा आपूर्ति की जाती है तो उत्पादन में सावधान रहें। जावास्क्रिप्ट (और एक्सटेंशन द्वारा जेएसओएन) भागने और विशेष पात्रों के संचालन में काफी जटिल है। आप संभवतः एक अच्छी तरह से परीक्षण पुस्तकालय को अपने JSON को उत्पादन में संपादित करना चाहते हैं। –

+0

शायद आपको प्रश्न गलत हो गया है। मुझे key1 के मान को संशोधित करने में दिलचस्पी है और key1 स्वयं नहीं है। तो पहले मामले में, key1 का मान हैलो, जिसे मैं संशोधित करना चाहता था। – linuxeasy

+0

ओह, उत्तर वही रहता है; यह केवल एक उदाहरण है जिसे बदला जाना चाहिए। – SylvainL

1

आप हमेशा जेसन एलेमेंट से अलग प्रकार प्राप्त कर सकते हैं, या ऑब्जेक्ट (यदि संभव हो) पर डालने के लिए JsonElement.getAsJsonObject का उपयोग कर सकते हैं।

String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"}, ...]"; 

JsonArray jsonArray = gson.fromJson(jsonString, JsonElement.class).getAsJsonArray(); 
JsonObject firstObject = jsonArray.get(i).getAsJsonObject(); 
firstObject.addProperty("key1", "Test"); 

मैं पहले गलत था; ऐसा कोई JsonArray एडाप्टर नहीं लगता है; आपको एक जेसन एलिमेंट प्राप्त करना होगा और कास्टिंग टूल का उपयोग करना होगा।

6

यहां सबसे छोटा है जिसके साथ मैं आया हूं।

JsonElement je = gson.fromJson(jsonString, JsonElement.class); 
JsonObject jo = je.getAsJsonObject(); 
jo.add("key", value); 

एक बार जब आपके पास जेसनऑब्जेक्ट हो, तो जीएसन में इसका उपयोग करने के कई तरीके हैं।

संबंधित मुद्दे