दिलचस्प पोस्ट
सी # के समान जावास्क्रिप्ट में फ़ॉर्मेट संख्याएं मेवेन क्लासपाथ ऑर्डर के मुद्दे क्या सेलेनियम 2 में फ़ायरफ़ॉक्सड्राइवर के लिए एक सिद्ध माउसओवर समाधान है? क्या आप सी # कोड में एक मूल अपवाद पकड़ सकते हैं? पांडा: दिए गए कॉलम के लिए राशि डेटाफ्रेम पंक्तियों एकाधिक डेटाबेस पर इकाई ढांचे का उपयोग करना पंक्ति या स्तंभ स्थान के बावजूद, पांडा डेटाफ्रेम में अनन्य मान खोजें कैफ डेटा स्तर उदाहरण चरण कदम से मैं ASP.net/C# ऐप कॉन्फ़िग फ़ाइल मान में मान के लिए एक एपरसैंड कैसे जोड़ सकता / सकती हूं? isset () और खाली () – का उपयोग करने के लिए मेरीएसक्ल में एक बड़ी तालिका से यादृच्छिक पंक्ति का त्वरित चयन एसक्यूएल दो तालिका में शामिल हो पासवर्ड_हाश का उपयोग कैसे करें मैं जीएसन के लिए एक कस्टम JSON deserializer कैसे लिखूं? एचटीएमएल 5 फॉर्म आवश्यक विशेषता कस्टम सत्यापन संदेश सेट करें?

मैं जेएसओएन को जीएसएन का उपयोग कर एक हैशमैक्स में कैसे परिवर्तित कर सकता / सकती हूं?

मैं एक ऐसे सर्वर से डेटा का अनुरोध कर रहा हूं जो जेएसएएन प्रारूप में डेटा देता है। अनुरोध करते समय जेसनॉन में एक हैशमार्क कास्टिंग करना मुश्किल नहीं था, लेकिन दूसरी तरफ थोड़ा मुश्किल लगता है। JSON प्रतिक्रिया इस तरह दिखती है:

{ "header" : { "alerts" : [ { "AlertID" : "2", "TSExpires" : null, "Target" : "1", "Text" : "woot", "Type" : "1" }, { "AlertID" : "3", "TSExpires" : null, "Target" : "1", "Text" : "woot", "Type" : "1" } ], "session" : "0bc8d0835f93ac3ebbf11560b2c5be9a" }, "result" : "4be26bc400d3c" } 

इस डेटा तक पहुंचने में सबसे आसान तरीका क्या होगा? मैं जीएसओएन मॉड्यूल का उपयोग कर रहा हूँ

Solutions Collecting From Web of "मैं जेएसओएन को जीएसएन का उपयोग कर एक हैशमैक्स में कैसे परिवर्तित कर सकता / सकती हूं?"

हेयर यू गो

 Type type = new TypeToken<Map<String, String>>(){}.getType(); Map<String, String> myMap = gson.fromJson("{'k1':'apple','k2':'orange'}", type); 

यह कोड काम करता है:

 Gson gson = new Gson(); String json = "{\"k1\":\"v1\",\"k2\":\"v2\"}"; Map<String,Object> map = new HashMap<String,Object>(); map = (Map<String,Object>) gson.fromJson(json, map.getClass()); 

मुझे पता है यह एक काफी पुराना सवाल है, लेकिन मैं नेस्टेड जेएसओएन को एक Map<String, Object> पर जनरेट करने के लिए एक समाधान की तलाश कर रहा था, और कुछ नहीं पाया।

जिस तरह से मेरा yaml deserializer काम करता है, वह JSON ऑब्जेक्ट्स को Map<String, Object> डिफ़ॉल्ट करता है जब आप किसी प्रकार निर्दिष्ट नहीं करते, लेकिन जीएसएन ऐसा करने में प्रतीत नहीं होता है सौभाग्य से आप इसे एक कस्टम deserializer के साथ पूरा कर सकते हैं

मैंने निम्नलिखित deserializer का उपयोग कुछ स्वाभाविक रूप से deserialize करने के लिए, JsonObject को Map<String, Object> और Object[] लिए JsonArray s करने के लिए JsonArray , जहां सभी बच्चों को इसी तरह deserialized हैं

 private static class NaturalDeserializer implements JsonDeserializer<Object> { public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { if(json.isJsonNull()) return null; else if(json.isJsonPrimitive()) return handlePrimitive(json.getAsJsonPrimitive()); else if(json.isJsonArray()) return handleArray(json.getAsJsonArray(), context); else return handleObject(json.getAsJsonObject(), context); } private Object handlePrimitive(JsonPrimitive json) { if(json.isBoolean()) return json.getAsBoolean(); else if(json.isString()) return json.getAsString(); else { BigDecimal bigDec = json.getAsBigDecimal(); // Find out if it is an int type try { bigDec.toBigIntegerExact(); try { return bigDec.intValueExact(); } catch(ArithmeticException e) {} return bigDec.longValue(); } catch(ArithmeticException e) {} // Just return it as a double return bigDec.doubleValue(); } } private Object handleArray(JsonArray json, JsonDeserializationContext context) { Object[] array = new Object[json.size()]; for(int i = 0; i < array.length; i++) array[i] = context.deserialize(json.get(i), Object.class); return array; } private Object handleObject(JsonObject json, JsonDeserializationContext context) { Map<String, Object> map = new HashMap<String, Object>(); for(Map.Entry<String, JsonElement> entry : json.entrySet()) map.put(entry.getKey(), context.deserialize(entry.getValue(), Object.class)); return map; } } 

handlePrimitive अंदर handlePrimitive पद्धति यह सुनिश्चित करने के लिए है कि आप केवल एक बार डबल या पूर्णांक या लंबे समय तक प्राप्त कर सकते हैं, और संभवतः बेहतर हो सकता है या कम से कम सरल हो सकता है यदि आप बिगडीक्विमल्स के साथ ठीक हो, जो मेरा मानना ​​है कि डिफ़ॉल्ट है

आप इस एडाप्टर को इस तरह पंजीकृत कर सकते हैं:

 GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer()); Gson gson = gsonBuilder.create(); 

और फिर इसे पसंद करें:

 Object natural = gson.fromJson(source, Object.class); 

मुझे यकीन नहीं है कि यह जीएसएन में डिफ़ॉल्ट व्यवहार क्यों नहीं है, क्योंकि यह अधिकांश अन्य अर्द्ध-संरचित धारावाहिक पुस्तकालयों में है …

नए जीएसएन लिब के लिए अद्यतन:
अब आप सीधे नेस्टेड जेसन को पार्स करने के लिए पार्स कर सकते हैं, लेकिन आपको जागरूक होना चाहिए कि आप जेसन को Map<String, Object> टाइप में पार्स करने की कोशिश करते हैं: यह अपवाद उठाएगा इसे ठीक करने के लिए, केवल परिणाम को LinkedTreeMap प्रकार के रूप में LinkedTreeMap करें। नीचे दिए गए उदाहरण:

 String nestedJSON = "{"id":"1","message":"web_didload","content":{"success":1}}; Gson gson = new Gson(); LinkedTreeMap result = gson.fromJson(nestedJSON , LinkedTreeMap.class); 

गूगल के जीएसएन 2.7 के साथ (शायद पहले के संस्करण भी थे, लेकिन मैंने वर्तमान संस्करण 2.7 के साथ परीक्षण किया) यह उतना सरल है:

 Map map = gson.fromJson(jsonString, Map.class); 

जो एक Map का प्रकार com.google.gson.internal.LinkedTreeMap और नेस्टेड ऑब्जेक्ट्स, एरेज़ इत्यादि पर लगातार काम करता है।

मैं ओपी उदाहरण की तरह चल रहा था (केवल सिंगल-कोट्स के साथ दोबारा जगह और हटाई गई रिक्त स्थान):

 String jsonString = "{'header': {'alerts': [{'AlertID': '2', 'TSExpires': null, 'Target': '1', 'Text': 'woot', 'Type': '1'}, {'AlertID': '3', 'TSExpires': null, 'Target': '1', 'Text': 'woot', 'Type': '1'}], 'session': '0bc8d0835f93ac3ebbf11560b2c5be9a'}, 'result': '4be26bc400d3c'}"; Map map = gson.fromJson(jsonString, Map.class); System.out.println(map.getClass().toString()); System.out.println(map); 

और निम्नलिखित आउटपुट मिला:

 class com.google.gson.internal.LinkedTreeMap {header={alerts=[{AlertID=2, TSExpires=null, Target=1, Text=woot, Type=1}, {AlertID=3, TSExpires=null, Target=1, Text=woot, Type=1}], session=0bc8d0835f93ac3ebbf11560b2c5be9a}, result=4be26bc400d3c} 

मेरे पास सटीक एक ही प्रश्न था और यहां समाप्त हुआ था। मेरे पास एक अलग दृष्टिकोण था जो बहुत आसान लगता है (शायद जीएसएन के नए संस्करण?)

  Gson gson = new Gson(); Map jsonObject = (Map) gson.fromJson(data, Object.class); 

निम्नलिखित json के साथ

 { "map-00": { "array-00": [ "entry-00", "entry-01" ], "value": "entry-02" } } 

निम्नलिखित

  Map map00 = (Map) jsonObject.get("map-00"); List array00 = (List) map00.get("array-00"); String value = (String) map00.get("value"); for (int i = 0; i < array00.size(); i++) { System.out.println("map-00.array-00[" + i + "]= " + array00.get(i)); } System.out.println("map-00.value = " + value); 

आउटपुट

 map-00.array-00[0]= entry-00 map-00.array-00[1]= entry-01 map-00.value = entry-02 

अपने jsonObject पर नेविगेट करते समय आप गतिशील रूप से इंस्टॉलेशन का उपयोग कर सकते हैं कुछ इस तरह

 Map json = gson.fromJson(data, Object.class); if(json.get("field") instanceof Map) { Map field = (Map)json.get("field"); } else if (json.get("field") instanceof List) { List field = (List)json.get("field"); } ... 

यह मेरे लिए काम करता है, इसलिए इसे आपके लिए काम करना चाहिए 😉

यह प्रयास करें, यह काम करेगा। मैंने इसका इस्तेमाल हाशेटेबल के लिए किया था।

 public static Hashtable<Integer, KioskStatusResource> parseModifued(String json) { JsonObject object = (JsonObject) new com.google.gson.JsonParser().parse(json); Set<Map.Entry<String, JsonElement>> set = object.entrySet(); Iterator<Map.Entry<String, JsonElement>> iterator = set.iterator(); Hashtable<Integer, KioskStatusResource> map = new Hashtable<Integer, KioskStatusResource>(); while (iterator.hasNext()) { Map.Entry<String, JsonElement> entry = iterator.next(); Integer key = Integer.parseInt(entry.getKey()); KioskStatusResource value = new Gson().fromJson(entry.getValue(), KioskStatusResource.class); if (value != null) { map.put(key, value); } } return map; } 

कियोस्कस्टैटस रिसोर्स को अपने क्लास में बदलें और अपने कुंजी वर्ग में पूर्णांक बदलें।

यहां मैं जो प्रयोग कर रहा हूं वह है:

 public static HashMap<String, Object> parse(String json) { JsonObject object = (JsonObject) parser.parse(json); Set<Map.Entry<String, JsonElement>> set = object.entrySet(); Iterator<Map.Entry<String, JsonElement>> iterator = set.iterator(); HashMap<String, Object> map = new HashMap<String, Object>(); while (iterator.hasNext()) { Map.Entry<String, JsonElement> entry = iterator.next(); String key = entry.getKey(); JsonElement value = entry.getValue(); if (!value.isJsonPrimitive()) { map.put(key, parse(value.toString())); } else { map.put(key, value.getAsString()); } } return map; } 

मैंने एक कस्टम जेसनडीएसराइलाइज़र के साथ एक ऐसी ही समस्या को पार किया है मैंने इसे थोड़ा सामान्य बनाने की कोशिश की लेकिन अभी तक पर्याप्त नहीं है यह एक समाधान है, हालांकि मेरी जरूरतों को पूरा करता है

सबसे पहले आपको नक्शा ऑब्जेक्ट के लिए एक नया जेसनडेसेराइलाइज़र लागू करना होगा।

 public class MapDeserializer<T, U> implements JsonDeserializer<Map<T, U>> 

और deserialize विधि इस के समान दिखाई देगी:

 public Map<T, U> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (!json.isJsonObject()) { return null; } JsonObject jsonObject = json.getAsJsonObject(); Set<Entry<String, JsonElement>> jsonEntrySet = jsonObject.entrySet(); Map<T, U> deserializedMap = new HashMap<T, U>(); for (Entry<java.lang.String, JsonElement> entry : jsonEntrySet) { try { U value = context.deserialize(entry.getValue(), getMyType()); deserializedMap.put((T) entry.getKey(), value); } catch (Exception ex) { logger.info("Could not deserialize map.", ex); } } return deserializedMap; } 

इस समाधान के साथ चुनाव, यह है कि मेरा नक्शा कुंजी हमेशा "स्ट्रिंग" प्रकार का होता है हालांकि कुछ चीजों को चिपकाने के द्वारा कोई इसे सामान्य बना सकता है इसके अलावा, मुझे यह कहना चाहिए, कि कन्स्ट्रक्टर में मान का वर्ग पारित किया जाना चाहिए। तो मेरे कोड में विधि प्राप्त getMyType() मेप के मानों का प्रकार देता है, जो कन्स्ट्रक्टर में दिया गया था।

आप इस पोस्ट को संदर्भित कर सकते हैं मैं जीएसन के लिए एक कस्टम JSON deserializer कैसे लिखूं? कस्टम deserializers के बारे में अधिक जानने के लिए

  HashMap<String, String> jsonToMap(String JsonDetectionString) throws JSONException { HashMap<String, String> map = new HashMap<String, String>(); Gson gson = new Gson(); map = (HashMap<String, String>) gson.fromJson(JsonDetectionString, map.getClass()); return map; } 

JSONObject आमतौर पर डेटा को स्टोर करने के लिए आंतरिक रूप से हैशमैक्स का उपयोग करता है। तो, आप इसे अपने कोड में मानचित्र के रूप में उपयोग कर सकते हैं।

उदाहरण,

 JSONObject obj = JSONObject.fromObject(strRepresentation); Iterator i = obj.entrySet().iterator(); while (i.hasNext()) { Map.Entry e = (Map.Entry)i.next(); System.out.println("Key: " + e.getKey()); System.out.println("Value: " + e.getValue()); } 

मैं इस कोड का इस्तेमाल किया:

 Gson gson = new Gson(); HashMap<String, Object> fields = gson.fromJson(json, HashMap.class);