web-dev-qa-db-fra.com

Convertir JSON en carte

Quel est le meilleur moyen de convertir un code JSON comme ceci:

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

dans une carte Java dans laquelle sont les clés (champ1, champ2) et les valeurs de ces champs sont (valeur1, valeur2).

Des idées? Devrais-je utiliser Json-lib pour ça? Ou mieux si j'écris mon propre analyseur?

161
David Santamaria

J'espère que vous plaisantez à propos de l'écriture de votre propre analyseur. :-)

Pour un mappage aussi simple, la plupart des outils de http://json.org (section Java) fonctionneraient . Pour l'un d'eux (Jackson, http://wiki.fasterxml.com/JacksonInFiveMinutes ), vous feriez:

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

(où JSON_SOURCE est un fichier, un flux d'entrée, un lecteur ou une chaîne de contenu json)

290
StaxMan

J'aime google gson library.
Quand vous ne connaissez pas la structure de json. Vous pouvez utiliser

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

et alors vous pouvez travailler avec JSON. par exemple. comment obtenir "valeur1" de votre gson:

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

Utilisation de la bibliothèque GSON: 

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

Utilisez le code suivant:

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

Utilisez JSON lib E.g. 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));

}
16
j.d.

Mon article pourrait être utile aux autres, alors imaginez que vous avez une carte avec un objet spécifique dans les valeurs, quelque chose comme ça:

{  
   "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
      }
   }
}

Pour analyser ce fichier JSON avec la bibliothèque GSON, rien de plus simple: Si votre projet est mavenisé

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

Ensuite, utilisez cet extrait:

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());
}

Le POJO correspondant devrait être quelque chose comme ça:

public class ShoppingList {

    int id;

    String label;

    boolean current;

    int nb_reference;

    //Setters & Getters !!!!!
}

J'espère que ça aide !

12
Jad B.

De cette façon, cela fonctionne comme une carte ...

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

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

Je le fais de cette façon. C'est simple.

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);
    }
}
4
Pavan

La bibliothèque JsonTools est très complète. Il peut être trouvé à Github .

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

Avec Google Gson 2.7 (probablement aussi des versions antérieures, mais j'ai testé la version 2.7), c'est aussi simple que:

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

Ce qui retourne une carte de type class com.google.gson.internal.LinkedTreeMap et fonctionne de manière récursive sur les objets imbriqués.

2
isapir

Une autre alternative est json-simple qui se trouve dans Maven Central :

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

L'artefact est 24 Ko, n'a pas d'autres dépendances d'exécution.

1
pcjuzer
import net.sf.json.JSONObject

JSONObject.fromObject(yourJsonString).toMap
0
Li Rao

Underscore-Java library peut convertir une chaîne json en hash map. Je suis le mainteneur du projet.

Exemple de code:

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
Valentyn Kolesnikov