JSON को मैप में बदलें


190

JSON कोड को इस रूप में परिवर्तित करने का सबसे अच्छा तरीका क्या है:

{ 
    "data" : 
    { 
        "field1" : "value1", 
        "field2" : "value2"
    }
}

एक जावा मानचित्र में जिसमें एक कुंजी (फ़ील्ड 1, फ़ील्ड 2) और उन फ़ील्ड के मान हैं (मान 1, मान 2)।

कोई विचार? क्या मुझे इसके लिए Json-lib का उपयोग करना चाहिए? या बेहतर है अगर मैं अपना खुद का पार्सर लिखूं?


मैंने किसी भी पुस्तकालय का उपयोग किए बिना इसके लिए कोड लिखा है। stackoverflow.com/questions/21720759/jsonobject-to-map/…
विकास गुप्ता

जवाबों:


335

मुझे आशा है कि आप अपने खुद के पार्सर लिखने के बारे में मजाक कर रहे थे। :-)

इस तरह के एक सरल मानचित्रण के लिए, http://json.org (अनुभाग जावा) से अधिकांश उपकरण काम करेंगे। उनमें से एक के लिए (जैक्सन https://github.com/FasterXML/jackson-databind/#5-minute-tutorial-streaming-parser-generator ), आप करेंगे:

Map<String,Object> result =
        new ObjectMapper().readValue(JSON_SOURCE, HashMap.class);

(जहाँ JSON_SOURCE एक फ़ाइल, इनपुट स्ट्रीम, रीडर या जसन सामग्री स्ट्रिंग है)


36
इसके अलावा, यदि आप एक टाइप्ड मैप चाहते हैं (जावा जेनरिक का शोषण करते हैं), तो आप कर सकते हैं: मैप <स्ट्रींग, मायपोजो> टाइपपेडप = mapper.readValue (jsonStream, new TypeReference <<string>, MyPojo >> () {});
obe6

5
यदि आप मावेन परियोजना के साथ काम करते हैं, तो आपको <निर्भरता> <groupId> com.fasterxml.jackson.core </ groupId> <विरूपण साक्ष्य> जैकसन-डेटाबिंड </ विरूपण साक्ष्य </ संस्करण> 2.4.4 </ संस्करण> </ निर्भरता की आवश्यकता होगी >
लोबो

2
और लग रहा है कि जैक्सन 09 के बाद से स्थानांतरित हो गया है: जैक्सन डेटा-बाइंड
जेकब। सार्क

@ obe6 मुझे लगता है कि ओपी मजाक नहीं कर रहा है। क्या आप अपने मनमाने चर नाम के अलावा अपने कोड स्निपेट में कहीं भी एक "JSON" पा सकते हैं? मैं जैक्सन एपीआई में नामों के कारण भी संघर्ष कर रहा हूं।
एथेरस

FWTW, जबकि @ obe6 का उत्तर तकनीकी रूप से सही है, आप छोटे रूप का भी उपयोग कर सकते हैं Map<String,Object> result = mapper.readValue(source, Map.class):।
स्टैक्मैन मैन 28'18

35

GSON लाइब्रेरी का उपयोग करना:

import com.google.gson.Gson;
import com.google.common.reflect.TypeToken;
import java.lang.reclect.Type;

निम्नलिखित कोड का उपयोग करें:

Type mapType = new TypeToken<Map<String, Map>>(){}.getType();  
Map<String, String[]> son = new Gson().fromJson(easyString, mapType);

7
जावा अपने सबसे अच्छे समय पर: TypeToken<Map<String, Map>>:-)
फ्रॉडरिक

2
नए टाइपटोकन के साथ <मानचित्र <स्ट्रिंग, ऑब्जेक्ट >> यह तब भी काम करेगा जब अंदर सरणियां हों।
9ilsdx 9rvj 0lo

33

मुझे google gson पुस्तकालय पसंद है ।
जब आप जसन की संरचना को नहीं जानते हैं। आप उपयोग कर सकते हैं

JsonElement root = new JsonParser().parse(jsonString);

और फिर आप json के साथ काम कर सकते हैं। उदाहरण के लिए अपने gson से "value1" कैसे प्राप्त करें:

String value1 = root.getAsJsonObject().get("data").getAsJsonObject().get("field1").getAsString();

19
यदि आप अनपेक्षित डेटा प्राप्त करते हैं तो यह NullPointerException 5 विभिन्न तरीकों से फेंक सकता है।
dfraser

अब आप .path () का उपयोग कर सकते हैं और यह एक NPE
C2H50H

18

JSON lib उदाहरण http://www.json.org/java/ का उपयोग करें

// Assume you have a Map<String, String> in JSONObject jdata
@SuppressWarnings("unchecked")
Iterator<String> nameItr = jdata.keys();
Map<String, String> outMap = new HashMap<String, String>();
while(nameItr.hasNext()) {
    String name = nameItr.next();
    outMap.put(name, jdata.getString(name));

}

12

मेरी पोस्ट दूसरों के लिए मददगार हो सकती है, इसलिए कल्पना करें कि आपके पास मूल्यों में एक विशिष्ट वस्तु के साथ एक नक्शा है, ऐसा कुछ:

{  
   "shopping_list":{  
      "996386":{  
         "id":996386,
         "label":"My 1st shopping list",
         "current":true,
         "nb_reference":6
      },
      "888540":{  
         "id":888540,
         "label":"My 2nd shopping list",
         "current":false,
         "nb_reference":2
      }
   }
}

इस JSON फ़ाइल को GSON लाइब्रेरी के साथ पार्स करने के लिए, यह आसान है: यदि आपका प्रोजेक्ट मावेनाइज़ किया गया है

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.3.1</version>
</dependency>

फिर इस स्निपेट का उपयोग करें:

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

//Read the JSON file
JsonElement root = new JsonParser().parse(new FileReader("/path/to/the/json/file/in/your/file/system.json"));

//Get the content of the first map
JsonObject object = root.getAsJsonObject().get("shopping_list").getAsJsonObject();

//Iterate over this map
Gson gson = new Gson();
for (Entry<String, JsonElement> entry : object.entrySet()) {
    ShoppingList shoppingList = gson.fromJson(entry.getValue(), ShoppingList.class);
    System.out.println(shoppingList.getLabel());
}

संबंधित POJO कुछ इस तरह होना चाहिए:

public class ShoppingList {

    int id;

    String label;

    boolean current;

    int nb_reference;

    //Setters & Getters !!!!!
}

आशा करता हूँ की ये काम करेगा !


5

इस तरह से यह एक मानचित्र की तरह काम करता है ...

JSONObject fieldsJson = new JSONObject(json);
String value = fieldsJson.getString(key);

<dependency>
    <groupId>org.codehaus.jettison</groupId>
    <artifactId>jettison</artifactId>
    <version>1.1</version>
</dependency>

1
हां, लेकिन आपको JSON अपवादों के कारण हर एक ´get but को कोशिश / पकड़ में लपेटना होगा।
मैकीज स्विक

1
आप JsonMap implements Map<String,ObjectJSONObject को लपेटने के लिए एक वर्ग लिख सकते हैं । तब आपको सच्चा Mapइंटरफ़ेस मिलता है।
जेफरी ब्लाटमैन

कृपया उपयोग की गई लाइब्रेरी जोड़ें।
मवरमैंड

5

मैं इसे इस तरह से करता हूं। यह आसान है।

import java.util.Map;
import org.json.JSONObject;
import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        JSONObject jsonObj = new JSONObject("{ \"f1\":\"v1\"}");
        @SuppressWarnings("unchecked")
        Map<String, String> map = new Gson().fromJson(jsonObj.toString(),Map.class);
        System.out.println(map);
    }
}

मैंने इस दृष्टिकोण की कोशिश की लेकिन इसका काम नहीं कर रहा है ... क्या आप इसके लिए जवाब दे सकते हैं? stackoverflow.com/questions/60329223/…
शिव

3
java.lang.reflect.Type mapType = new TypeToken<Map<String, Object>>(){}.getType();
Gson gson = new Gson();
Map<String, Object> categoryicons = gson.fromJson(json, mapType );


2

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

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

जो एक प्रकार का नक्शा लौटाता है class com.google.gson.internal.LinkedTreeMapऔर नेस्टेड वस्तुओं पर पुनरावृत्ति करता है।


1

एक और विकल्प json-simple है जो Maven Central में पाया जा सकता है :

(JSONObject)JSONValue.parse(someString); //JSONObject is actually a Map.

विरूपण साक्ष्य 24kbytes है, अन्य रनटाइम निर्भरता नहीं है।


मैं nullएक साधारण JSON स्ट्रिंग से वापस आता हूं जहां एक मान स्ट्रिंग का एक सरणी है।
इपिर

1

यदि आप org.json का उपयोग कर रहे हैं, तो JSONObject के पास एक विधि है toMap()। आप आसानी से कर सकते हैं:

Map<String, Object> myMap = myJsonObject.toMap();


0

अंडरस्कोर-जावा लाइब्रेरी json string को हैश मैप में बदल सकती है। मैं परियोजना का अनुरक्षक हूं।

कोड उदाहरण:

import com.github.underscore.lodash.U;
import java.util.*;

public class Main {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        String json = "{"
            + "    \"data\" :"
            + "    {"
            + "        \"field1\" : \"value1\","
            + "        \"field2\" : \"value2\""
            + "    }"
            + "}";

       Map<String, Object> data = (Map) U.get((Map<String, Object>) U.fromJson(json), "data");
       System.out.println(data);

       // {field1=value1, field2=value2}
    }
}

0

यदि आपको किसी भी निर्भरता के बिना शुद्ध जावा की आवश्यकता है, तो आप जावा 8 से नैशोर्न एपीआई में बिल्ड का उपयोग कर सकते हैं। यह जावा 11 में अपग्रेड किया गया है।

यह मेरे लिए काम कर रहा है:

...
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
...

public class JsonUtils {

    public static Map parseJSON(String json) throws ScriptException {
        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine engine = sem.getEngineByName("javascript");

        String script = "Java.asJSONCompatible(" + json + ")";

        Object result = engine.eval(script);

        return (Map) result;
    }
}

नमूना उपयोग

JSON:

{
    "data":[
        {"id":1,"username":"bruce"},
        {"id":2,"username":"clark"},
        {"id":3,"username":"diana"}
    ]
}

कोड:

...
import jdk.nashorn.internal.runtime.JSONListAdapter;
...

public static List<String> getUsernamesFromJson(Map json) {
    List<String> result = new LinkedList<>();

    JSONListAdapter data = (JSONListAdapter) json.get("data");

    for(Object obj : data) {
        Map map = (Map) obj;
        result.add((String) map.get("username"));
    }

    return result;
}

-1

JSON से मैप हमेशा एक स्ट्रिंग / ऑब्जेक्ट डेटा प्रकार होना चाहिए। मैं गूगल से जीएसओएन परिवाद haved

बहुत अच्छी तरह से काम करता है और जेडीके 1.5 न्यूनतम आवश्यकता है।


1
आपने GSON का उपयोग कैसे किया?
निंजाकोडर 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.