Question Bibliothèque pour encoder / décoder de json à java.util.Map?


Est-ce que quelqu'un connaît une bibliothèque Java qui pourrait facilement encoder des cartes Java dans des objets json et inversement?

METTRE À JOUR

Pour des raisons qui ne pouvaient pas expliquer (et je déteste parfois) je ne peux pas utiliser de génériques sur mon environnement.

Ce que j'essaie de faire, c'est d'avoir quelque chose comme ça:

Map a = new HashMap();
a.put( "name", "Oscar" );

Map b = new HashMap();
b.put( "name", "MyBoss"); 
a.put( "boss",  b ) ;


List list = new ArrayList();
list.add( a );
list.add( b );


 String json = toJson( list );
 // and create the json:
 /*
    [
       {
         "name":"Oscar",
         "boss":{
              "name":"MyBoss"
         }
        },
        {
            "name":"MyBoss"
        }
     ]

  */ 

Et pouvoir le reprendre comme une liste de cartes

 List aList = ( List ) fromJson( jsonStirng );

15
2018-03-22 23:28


origine


Réponses:


JSON-Simple semble relativement facile à utiliser (exemples ci-dessous).

Map to JSON:

  Map map = new HashMap();
  map.put("name", "foo");
  map.put("nickname", "bar");
  String jsonText = JSONValue.toJSONString(map);

JSON to List / Map:

  String s = yourJsonString;
  List list = (JSONArray) JSONValue.parse(s);       
  Map map = (JSONObject) list.get(0);

14
2018-03-22 23:34



Vous pouvez utiliser Google Gson pour ça. Il a un excellent support pour Types génériques.

Voici un SSCCE:

package com.stackoverflow.q2496494;

import java.util.LinkedHashMap;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Test {

   public static void main(String... args) {
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        Gson gson = new Gson();

        // Serialize.
        String json = gson.toJson(map);
        System.out.println(json); // {"key1":"value1","key2":"value2","key3":"value3"}

        // Deserialize.
        Map<String, String> map2 = gson.fromJson(json, new TypeToken<Map<String, String>>() {}.getType());
        System.out.println(map2); // {key1=value1, key2=value2, key3=value3}
    }

}

33
2018-03-22 23:37



Vous pouvez voir le site depuis Json.org pour la liste des bonnes bibliothèques JSON en Java.

JSon.org est propre la mise en oeuvre  JSONObject peut faire exactement cela. De leur JavaDoC

 /**
     * Construct a JSONObject from a Map.
     * 
     * @param map A map object that can be used to initialize the contents of
     *  the JSONObject.
     */
    public JSONObject(Map map);

tu peux faire

JSONObject json = new JSONObject(map);

Pour convertir la chaîne JSON en objet ....

String jsonString = "{\"name\" : \"some name\", \"age\" : 10}";
JSONObject json = new JSONObject(jsonString);

et vous pouvez accéder à des valeurs telles que:

int age = json.getInt("age");

Constructeur JavaDoC

Construire un objet JSONObject à partir d'une source   Chaîne de texte JSON. C'est le plus   constructeur JSONObject couramment utilisé.

Paramètres: source Début de chaîne   avec { (accolade gauche) et se terminant par }   (accolade droite).


4
2018-03-22 23:38



Je suppose que la vraie question serait de savoir quelle bibliothèque JSON (à partir de la page org.json) ne permettrait PAS de faire cela. Pour autant que je sache, chaque bibliothèque pourrait autoriser cela sous une forme ou une autre. Donc, chaque bibliothèque mentionnée jusqu'ici fonctionne.

Et pour ajouter des informations, Jackson fonctionne très bien avec toutes sortes de données, y compris les cartes de base et les listes:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValue(list);
List listOfMaps = mapper.readValue(json, List.class);

qui traiterait ce cas particulier. Bien que les informations de type générique puissent être utilisées, elles sont facultatives lors de l'utilisation d'une liaison "naturelle" aux types de conteneur JDK.


3
2017-11-04 00:15



Nous utilisons http://json-lib.sourceforge.net/ dans notre projet, cela fonctionne très bien.


1
2018-03-22 23:33



Lors de l'utilisation de google gson.

var getRowData =
[{
    "dayOfWeek": "Sun",
    "date": "11-Mar-2012",
    "los": "1",
    "specialEvent": "",
    "lrv": "0"
},
{
    "dayOfWeek": "Mon",
    "date": "",
    "los": "2",
    "specialEvent": "",
    "lrv": "0.16"
}];

    JsonElement root = new JsonParser().parse(request.getParameter("getRowData"));
     JsonArray  jsonArray = root.getAsJsonArray();
     JsonObject  jsonObject1 = jsonArray.get(0).getAsJsonObject();
     String dayOfWeek = jsonObject1.get("dayOfWeek").toString();

// en utilisant jackson

    JsonFactory f = new JsonFactory();
              ObjectMapper mapper = new ObjectMapper();
          JsonParser jp = f.createJsonParser(getRowData);
          // advance stream to START_ARRAY first:
          jp.nextToken();
          // and then each time, advance to opening START_OBJECT
         while (jp.nextToken() == JsonToken.START_OBJECT) {
            Map<String,Object> userData = mapper.readValue(jp, Map.class);
            userData.get("dayOfWeek");
            // process
           // after binding, stream points to closing END_OBJECT
        }

0
2018-04-22 10:02