Convertir une chaîne JSON en HashMap

157

J'utilise Java et j'ai une chaîne qui est JSON:

{
"name" : "abc" ,
"email id " : ["[email protected]","[email protected]","[email protected]"]
}

Puis ma carte en Java:

Map<String, Object> retMap = new HashMap<String, Object>();

Je souhaite stocker toutes les données du JSONObject dans ce HashMap.

Quelqu'un peut-il fournir un code pour cela? Je veux utiliser la org.jsonbibliothèque.

Vikas Gupta
la source
Je ne sais pas pourquoi json.org JSONObject n'a pas de getter pour la variable membre de la carte privée ...
vzamanillo
1
Solution dans Kotlin, veuillez vérifier cela en utilisant gson stackoverflow.com/a/53763826/8052227
AndyGeek
Mais pourquoi la question demande-t-elle JSONObjectquand cela semble être un type superflu qui n'est pas du tout nécessaire? La lecture de JSON Mapest simple en utilisant un certain nombre de bonnes bibliothèques JSON Java comme Jackson, GSON, Genson, Moshi. Alors pourquoi OP "veut" utiliser org.json?
StaxMan
1
@staxMan, En raison de la politique d'organisation, vous êtes parfois obligé d'utiliser uniquement les bibliothèques intégrées. Par conséquent, je devais utiliser uniquement org.json.
Vikas Gupta
@VikasGupta ok, cela a du sens, si vous utilisez une telle plate-forme (Android probablement)
StaxMan

Réponses:

214

J'ai écrit ce code il y a quelques jours par récursivité.

public static Map<String, Object> jsonToMap(JSONObject json) throws JSONException {
    Map<String, Object> retMap = new HashMap<String, Object>();

    if(json != JSONObject.NULL) {
        retMap = toMap(json);
    }
    return retMap;
}

public static Map<String, Object> toMap(JSONObject object) throws JSONException {
    Map<String, Object> map = new HashMap<String, Object>();

    Iterator<String> keysItr = object.keys();
    while(keysItr.hasNext()) {
        String key = keysItr.next();
        Object value = object.get(key);

        if(value instanceof JSONArray) {
            value = toList((JSONArray) value);
        }

        else if(value instanceof JSONObject) {
            value = toMap((JSONObject) value);
        }
        map.put(key, value);
    }
    return map;
}

public static List<Object> toList(JSONArray array) throws JSONException {
    List<Object> list = new ArrayList<Object>();
    for(int i = 0; i < array.length(); i++) {
        Object value = array.get(i);
        if(value instanceof JSONArray) {
            value = toList((JSONArray) value);
        }

        else if(value instanceof JSONObject) {
            value = toMap((JSONObject) value);
        }
        list.add(value);
    }
    return list;
}
Vikas Gupta
la source
1
Vous pouvez intercepter ces exceptions en toute sécurité et lancer des exceptions d'exécution ou des assertions à la place. Vous avez déjà vérifié que la clé existe et que le tableau a une valeur à l'index que vous vérifiez. De plus, créer le retMap avant de vérifier null car il est créé deux fois lorsque json! = Null. Ça a l'air bien.
user1122069
quelles importations / lib externes cela utilise-t-il? Eclipse ne peut pas dissoudre JSONArray et JSONObject
Gewure
2
@Gewure, utilisez org.json.
Vikas Gupta le
134

À l'aide de GSon , vous pouvez effectuer les opérations suivantes:

Map<String, Object> retMap = new Gson().fromJson(
    jsonString, new TypeToken<HashMap<String, Object>>() {}.getType()
);
Toon Borgers
la source
8
Mais je ne veux pas utiliser la bibliothèque GSon. Je suis autorisé à utiliser uniquement le lirary "org.json".
Vikas Gupta
comment le lire dans le jsonString? quelle est la différence entre jsonStringet json object?
smatthewenglish
@Toon pouvez-vous faire autrement?
Sharp Edge
@Tranchant. Voulez-vous dire comme ça new Gson().toJson(map);:?
Toon Borgers
Est-ce que cela ne sérialise que dans des objets primitifs? Que diriez-vous s'il y a une date que je veux également sérialisée dans la carte?
John Ernest Guadalupe
44

J'espère que cela fonctionnera, essayez ceci:

import com.fasterxml.jackson.databind.ObjectMapper;
Map<String, Object> response = new ObjectMapper().readValue(str, HashMap.class);

str, votre chaîne JSON

Aussi simple que cela, si vous voulez emailid,

String emailIds = response.get("email id").toString();
MukilanKarthikeyan
la source
Choisissez cette solution. Aussi pratique, lorsque votre chaîne JSON est destinée à avoir des types de données complexes comme des listes, comme expliqué ici
mania_device
comme j'utilisais au préalable la bibliothèque jackson dans mon application, c'est donc la meilleure réponse à mon problème. Merci :)
imans77
7

Voici le code de Vikas porté sur JSR 353:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.json.JsonArray;
import javax.json.JsonException;
import javax.json.JsonObject;

public class JsonUtils {
    public static Map<String, Object> jsonToMap(JsonObject json) {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JsonObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }

    public static Map<String, Object> toMap(JsonObject object) throws JsonException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keySet().iterator();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JsonArray) {
                value = toList((JsonArray) value);
            }

            else if(value instanceof JsonObject) {
                value = toMap((JsonObject) value);
            }
            map.put(key, value);
        }
        return map;
    }

    public static List<Object> toList(JsonArray array) {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.size(); i++) {
            Object value = array.get(i);
            if(value instanceof JsonArray) {
                value = toList((JsonArray) value);
            }

            else if(value instanceof JsonObject) {
                value = toMap((JsonObject) value);
            }
            list.add(value);
        }
        return list;
    }
}
Kolban
la source
cela me donne des erreurs dans la distinction entre JsonObject et JSONObject.
sirvon
@sirvon Pouvez-vous clarifier? Le code JSR 353 n'a pas de "JSONObject". Je ne recommande pas de mélanger les technologies JSON. Choisissez l'un ou l'autre.
Kolban
6
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;


public class JsonUtils {

    public static Map<String, Object> jsonToMap(JSONObject json) {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != null) {
            retMap = toMap(json);
        }
        return retMap;
    }

    public static Map<String, Object> toMap(JSONObject object) {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keySet().iterator();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }

    public static List<Object> toList(JSONArray array) {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.size(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}
Ashish Garg
la source
4
Il serait utile que vous ajoutiez une explication: comment votre réponse s'améliore-t-elle par rapport aux autres réponses existantes à cette question
artem
5

essayez ce code:

 Map<String, String> params = new HashMap<String, String>();
                try
                {

                   Iterator<?> keys = jsonObject.keys();

                    while (keys.hasNext())
                    {
                        String key = (String) keys.next();
                        String value = jsonObject.getString(key);
                        params.put(key, value);

                    }


                }
                catch (Exception xx)
                {
                    xx.toString();
                }
Oussama Ibrahim
la source
3

Conversion d'une chaîne JSON en carte

public static Map<String, Object> jsonString2Map( String jsonString ) throws JSONException{
        Map<String, Object> keys = new HashMap<String, Object>(); 

        org.json.JSONObject jsonObject = new org.json.JSONObject( jsonString ); // HashMap
        Iterator<?> keyset = jsonObject.keys(); // HM

        while (keyset.hasNext()) {
            String key =  (String) keyset.next();
            Object value = jsonObject.get(key);
            System.out.print("\n Key : "+key);
            if ( value instanceof org.json.JSONObject ) {
                System.out.println("Incomin value is of JSONObject : ");
                keys.put( key, jsonString2Map( value.toString() ));
            }else if ( value instanceof org.json.JSONArray) {
                org.json.JSONArray jsonArray = jsonObject.getJSONArray(key);
                //JSONArray jsonArray = new JSONArray(value.toString());
                keys.put( key, jsonArray2List( jsonArray ));
            } else {
                keyNode( value);
                keys.put( key, value );
            }
        }
        return keys;
    }

Conversion d'un tableau JSON en liste

public static List<Object> jsonArray2List( JSONArray arrayOFKeys ) throws JSONException{
        System.out.println("Incoming value is of JSONArray : =========");
        List<Object> array2List = new ArrayList<Object>();
        for ( int i = 0; i < arrayOFKeys.length(); i++ )  {
            if ( arrayOFKeys.opt(i) instanceof JSONObject ) {
                Map<String, Object> subObj2Map = jsonString2Map(arrayOFKeys.opt(i).toString());
                array2List.add(subObj2Map);
            }else if ( arrayOFKeys.opt(i) instanceof JSONArray ) {
                List<Object> subarray2List = jsonArray2List((JSONArray) arrayOFKeys.opt(i));
                array2List.add(subarray2List);
            }else {
                keyNode( arrayOFKeys.opt(i) );
                array2List.add( arrayOFKeys.opt(i) );
            }
        }
        return array2List;      
    }

Afficher JSON de n'importe quel format

public static void displayJSONMAP( Map<String, Object> allKeys ) throws Exception{
        Set<String> keyset = allKeys.keySet(); // HM$keyset
        if (! keyset.isEmpty()) {
            Iterator<String> keys = keyset.iterator(); // HM$keysIterator
            while (keys.hasNext()) {
                String key = keys.next();
                Object value = allKeys.get( key );
                if ( value instanceof Map ) {
                    System.out.println("\n Object Key : "+key);
                        displayJSONMAP(jsonString2Map(value.toString()));                   
                }else if ( value instanceof List ) {
                    System.out.println("\n Array Key : "+key);
                    JSONArray jsonArray = new JSONArray(value.toString());
                    jsonArray2List(jsonArray);
                }else {
                    System.out.println("key : "+key+" value : "+value);
                }
            }
        }   

    }

Google.gson à HashMap.

Yash
la source
3

Vous pouvez également utiliser l'API Jackson pour cela:

    final String json = "....your json...";
    final ObjectMapper mapper = new ObjectMapper();
    final MapType type = mapper.getTypeFactory().constructMapType(
        Map.class, String.class, Object.class);
    final Map<String, Object> data = mapper.readValue(json, type);
Swapnil Jaju
la source
3

Vous pouvez convertir n'importe quel JSONen mapen utilisant la bibliothèque Jackson comme ci-dessous:

String json = "{\r\n\"name\" : \"abc\" ,\r\n\"email id \" : [\"[email protected]\",\"[email protected]\",\"[email protected]\"]\r\n}";
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = new HashMap<String, Object>();
// convert JSON string to Map
map = mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
System.out.println(map);

Dépendances de Maven pour Jackson :

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

J'espère que cela aidera. Bon codage :)

Ankur Mahajan
la source
3

Convertir à l'aide de Jackson:

JSONObject obj = new JSONObject().put("abc", "pqr").put("xyz", 5);

Map<String, Object> map = new ObjectMapper().readValue(obj.toString(), new TypeReference<Map<String, Object>>() {});
Abhishek Pandey
la source
2

Vous pouvez utiliser la bibliothèque google gson pour convertir un objet json.

https://code.google.com/p/google-gson/

D'autres bibliothèques comme Jackson sont également disponibles.

Cela ne le convertira pas en carte. Mais vous pouvez faire tout ce que vous voulez.

Konza
la source
Sans utiliser de bibliothèque de wrapper est également très facile à convertir.
Vikas Gupta
2

Si vous détestez la récursivité - en utilisant une pile et javax.json pour convertir une chaîne Json en une liste de cartes:

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import javax.json.Json;
import javax.json.stream.JsonParser;

public class TestCreateObjFromJson {
    public static List<Map<String,Object>> extract(InputStream is) {
        List extracted = new ArrayList<>();
        JsonParser parser = Json.createParser(is);

        String nextKey = "";
        Object nextval = "";
        Stack s = new Stack<>();
        while(parser.hasNext()) {
            JsonParser.Event event = parser.next();
            switch(event) {
                case START_ARRAY :  List nextList = new ArrayList<>();
                                    if(!s.empty()) {
                                        // If this is not the root object, add it to tbe parent object
                                        setValue(s,nextKey,nextList);
                                    }
                                    s.push(nextList);
                                    break;
                case START_OBJECT : Map<String,Object> nextMap = new HashMap<>();
                                    if(!s.empty()) {
                                        // If this is not the root object, add it to tbe parent object
                                        setValue(s,nextKey,nextMap);
                                    }
                                    s.push(nextMap);
                                    break;
                case KEY_NAME : nextKey = parser.getString();
                                break;
                case VALUE_STRING : setValue(s,nextKey,parser.getString());
                                    break;
                case VALUE_NUMBER : setValue(s,nextKey,parser.getLong());
                                    break;
                case VALUE_TRUE :   setValue(s,nextKey,true);
                                    break;
                case VALUE_FALSE :  setValue(s,nextKey,false);
                                    break;
                case VALUE_NULL :   setValue(s,nextKey,"");
                                    break;
                case END_OBJECT :   
                case END_ARRAY  :   if(s.size() > 1) {
                                        // If this is not a root object, move up
                                        s.pop(); 
                                    } else {
                                        // If this is a root object, add ir ro rhw final 
                                        extracted.add(s.pop()); 
                                    }
                default         :   break;
            }
        }

        return extracted;
    }

    private static void setValue(Stack s, String nextKey, Object v) {
        if(Map.class.isAssignableFrom(s.peek().getClass()) ) ((Map)s.peek()).put(nextKey, v);
        else ((List)s.peek()).add(v);
    }
}
hareluya86
la source
2

Je viens d'utiliser Gson

HashMap<String, Object> map = new Gson().fromJson(json.toString(), HashMap.class);
Parameshwar
la source
1

Bref et utile:

/**
 * @param jsonThing can be a <code>JsonObject</code>, a <code>JsonArray</code>,
 *                     a <code>Boolean</code>, a <code>Number</code>,
 *                     a <code>null</code> or a <code>JSONObject.NULL</code>.
 * @return <i>Appropriate Java Object</i>, that may be a <code>Map</code>, a <code>List</code>,
 * a <code>Boolean</code>, a <code>Number</code> or a <code>null</code>.
 */
public static Object jsonThingToAppropriateJavaObject(Object jsonThing) throws JSONException {
    if (jsonThing instanceof JSONArray) {
        final ArrayList<Object> list = new ArrayList<>();

        final JSONArray jsonArray = (JSONArray) jsonThing;
        final int l = jsonArray.length();
        for (int i = 0; i < l; ++i) list.add(jsonThingToAppropriateJavaObject(jsonArray.get(i)));
        return list;
    }

    if (jsonThing instanceof JSONObject) {
        final HashMap<String, Object> map = new HashMap<>();

        final Iterator<String> keysItr = ((JSONObject) jsonThing).keys();
        while (keysItr.hasNext()) {
            final String key = keysItr.next();
            map.put(key, jsonThingToAppropriateJavaObject(((JSONObject) jsonThing).get(key)));
        }
        return map;
    }

    if (JSONObject.NULL.equals(jsonThing)) return null;

    return jsonThing;
}

Merci @Vikas Gupta .

Mir-Ismaili
la source
0

L'analyseur suivant lit un fichier, l'analyse en un fichier générique JsonElement, à l'aide de la JsonParser.parseméthode de Google , puis convertit tous les éléments du JSON généré en Java List<object>ou Map<String, Object>.

Remarque : le code ci-dessous est basé sur la réponse de Vikas Gupta .

GsonParser.java

import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;

public class GsonParser {
    public static void main(String[] args) {
        try {
            print(loadJsonArray("data_array.json", true));
            print(loadJsonObject("data_object.json", true));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void print(Object object) {
        System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(object).toString());
    }

    public static Map<String, Object> loadJsonObject(String filename, boolean isResource)
            throws UnsupportedEncodingException, FileNotFoundException, JsonIOException, JsonSyntaxException, MalformedURLException {
        return jsonToMap(loadJson(filename, isResource).getAsJsonObject());
    }

    public static List<Object> loadJsonArray(String filename, boolean isResource)
            throws UnsupportedEncodingException, FileNotFoundException, JsonIOException, JsonSyntaxException, MalformedURLException {
        return jsonToList(loadJson(filename, isResource).getAsJsonArray());
    }

    private static JsonElement loadJson(String filename, boolean isResource) throws UnsupportedEncodingException, FileNotFoundException, JsonIOException, JsonSyntaxException, MalformedURLException {
        return new JsonParser().parse(new InputStreamReader(FileLoader.openInputStream(filename, isResource), "UTF-8"));
    }

    public static Object parse(JsonElement json) {
        if (json.isJsonObject()) {
            return jsonToMap((JsonObject) json);
        } else if (json.isJsonArray()) {
            return jsonToList((JsonArray) json);
        }

        return null;
    }

    public static Map<String, Object> jsonToMap(JsonObject jsonObject) {
        if (jsonObject.isJsonNull()) {
            return new HashMap<String, Object>();
        }

        return toMap(jsonObject);
    }

    public static List<Object> jsonToList(JsonArray jsonArray) {
        if (jsonArray.isJsonNull()) {
            return new ArrayList<Object>();
        }

        return toList(jsonArray);
    }

    private static final Map<String, Object> toMap(JsonObject object) {
        Map<String, Object> map = new HashMap<String, Object>();

        for (Entry<String, JsonElement> pair : object.entrySet()) {
            map.put(pair.getKey(), toValue(pair.getValue()));
        }

        return map;
    }

    private static final List<Object> toList(JsonArray array) {
        List<Object> list = new ArrayList<Object>();

        for (JsonElement element : array) {
            list.add(toValue(element));
        }

        return list;
    }

    private static final Object toPrimitive(JsonPrimitive value) {
        if (value.isBoolean()) {
            return value.getAsBoolean();
        } else if (value.isString()) {
            return value.getAsString();
        } else if (value.isNumber()){
            return value.getAsNumber();
        }

        return null;
    }

    private static final Object toValue(JsonElement value) {
        if (value.isJsonNull()) {
            return null;
        } else if (value.isJsonArray()) {
            return toList((JsonArray) value);
        } else if (value.isJsonObject()) {
            return toMap((JsonObject) value);
        } else if (value.isJsonPrimitive()) {
            return toPrimitive((JsonPrimitive) value);
        }

        return null;
    }
}

FileLoader.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Scanner;

public class FileLoader {
    public static Reader openReader(String filename, boolean isResource) throws UnsupportedEncodingException, FileNotFoundException, MalformedURLException {
        return openReader(filename, isResource, "UTF-8");
    }

    public static Reader openReader(String filename, boolean isResource, String charset) throws UnsupportedEncodingException, FileNotFoundException, MalformedURLException {
        return new InputStreamReader(openInputStream(filename, isResource), charset);
    }

    public static InputStream openInputStream(String filename, boolean isResource) throws FileNotFoundException, MalformedURLException {
        if (isResource) {
            return FileLoader.class.getClassLoader().getResourceAsStream(filename);
        }

        return new FileInputStream(load(filename, isResource));
    }

    public static String read(String path, boolean isResource) throws IOException {
        return read(path, isResource, "UTF-8");
    }

    public static String read(String path, boolean isResource, String charset) throws IOException {
        return read(pathToUrl(path, isResource), charset);
    }

    @SuppressWarnings("resource")
    protected static String read(URL url, String charset) throws IOException {
        return new Scanner(url.openStream(), charset).useDelimiter("\\A").next();
    }

    protected static File load(String path, boolean isResource) throws MalformedURLException {
        return load(pathToUrl(path, isResource));
    }

    protected static File load(URL url) {
        try {
            return new File(url.toURI());
        } catch (URISyntaxException e) {
            return new File(url.getPath());
        }
    }

    private static final URL pathToUrl(String path, boolean isResource) throws MalformedURLException {
        if (isResource) {
            return FileLoader.class.getClassLoader().getResource(path);
        }

        return new URL("file:/" + path);
    }
}
M. Polywhirl
la source
0

C'est une vieille question et peut-être encore liée à quelqu'un.
Supposons que vous ayez la chaîne HashMap hashet JsonObject jsonObject.

1) Définissez la liste de clés.
Exemple:

ArrayList<String> keyArrayList = new ArrayList<>();  
keyArrayList.add("key0");   
keyArrayList.add("key1");  

2) Créez une boucle foreach, ajoutez à hashpartir de jsonObjectavec:

for(String key : keyArrayList){  
    hash.put(key, jsonObject.getString(key));
}

C'est ma démarche, j'espère qu'elle répondra à la question.

Muchtarpr
la source
-1

Imaginez que vous ayez une liste de courriels comme ci-dessous. n'est limité à aucun langage de programmation,

emailsList = ["[email protected]","[email protected]","[email protected]"]

Voici maintenant le code JAVA - pour convertir json en carte

JSONObject jsonObj = new JSONObject().put("name","abc").put("email id",emailsList);
Map<String, Object> s = jsonObj.getMap();
Abhijith Anil
la source
3
Quelle version de Java (6/7/8/9)? Quelle édition (SE / EE / Autre)? À quel package JSONObjectappartient votre code?
Abhishek Oza
-1

En utilisant json-simple, vous pouvez convertir des données JSON en mappage et mapper en JSON.

try
{
    JSONObject obj11 = new JSONObject();
    obj11.put(1, "Kishan");
    obj11.put(2, "Radhesh");
    obj11.put(3, "Sonal");
    obj11.put(4, "Madhu");

    Map map = new  HashMap();

    obj11.toJSONString();

    map = obj11;

    System.out.println(map.get(1));


    JSONObject obj12 = new JSONObject();

    obj12 = (JSONObject) map;

    System.out.println(obj12.get(1));
}
catch(Exception e)
{
    System.err.println("EROR : 01 :"+e);
}
13hola
la source