Come convertire hashmap in oggetto JSON in Java


287

Come convertire o trasmettere hashmap all'oggetto JSON in Java e convertire nuovamente l'oggetto JSON in stringa JSON?

Risposte:


435

Puoi usare:

new JSONObject(map);

Attenzione: questo funzionerà solo per aMap<String, String>!

Altre funzioni che puoi ottenere dalla sua documentazione
http://stleary.github.io/JSON-java/index.html


85
Funziona solo con String, String map e non con String, Object complessi.
slott

2
Si sta mettendo Mapin JSONObject, ma come è possibile ottenere questa mappa da JsonObject?
Yubaraj,


8
@slott è adatto alle versioni precedenti. Le versioni più recenti come kitkat funzionano bene con oggetti più complessi come HashMap <String, Object> () contenente HashMap <String, Object> () come Object. Quindi consiglio Gson.
Luismi,

Lo stavo solo cercando
Naveed Ahmad

169

Gson può anche essere usato per serializzare oggetti arbitrariamente complessi.

Ecco come lo usi:

Gson gson = new Gson(); 
String json = gson.toJson(myObject); 

Gsonconvertirà automaticamente le raccolte in JSONarray. Gson può serializzare campi privati ​​e ignora automaticamente i campi transitori.


1
Nota: questo non conserva le chiavi con valori null.
Vikas,

58

Esempio usando json

Map<String, Object> data = new HashMap<String, Object>();
    data.put( "name", "Mars" );
    data.put( "age", 32 );
    data.put( "city", "NY" );
    JSONObject json = new JSONObject();
    json.putAll( data );
    System.out.printf( "JSON: %s", json.toString(2) );

produzione::

JSON: {
  "age": 32,
  "name": "Mars",
  "city": "NY"
}

Puoi anche provare a utilizzare GSON di Google. GSON di Google è la migliore libreria disponibile per convertire oggetti Java nella loro rappresentazione JSON.

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


2
Ci scusiamo per gli scavi, ma ciò che fa la 2do in json.toString(2`)
Jack

public String toString (int radix) .toString (2) viene utilizzato per la rappresentazione String. Per ulteriori stackoverflow.com/questions/3615721/...
Mohammod Hossain

11
quale classe JSONObject è questa?
Janus Troelsen,

18
Nessun metodo simile: (new org.json.JSONObject ()). PutAll ();
Zon,

50

È possibile convertire Mapin JSONusando Jacksoncome segue:

Map<String,Object> map = new HashMap<>();
//You can convert any Object.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);
map.put("key3","string1");
map.put("key4","string2");

String json = new ObjectMapper().writeValueAsString(map);
System.out.println(json);

Dipendenze Maven per 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>

Se si utilizza la JSONObjectlibreria, è possibile convertire la mappa JSONnel modo seguente:

Map<String, Object> map = new HashMap<>();
// Convert a map having list of values.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);

JSONObject json = new JSONObject(map);
System.out.println(json);

Dipendenze Maven per JSONObject:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>

Spero che questo possa aiutare. Buona codifica.


1
non sapevo di poter passare Map come argomento, grazie, aiutato molto.
Gurkha,

@Gurkha Grazie per l'apprezzamento.
Ankur Mahajan,

1
@AnkurMahajan +1 per aver dato una risposta adeguata con dipendenza :)
Badman

1
String json = new ObjectMapper (). WriteValueAsString (mappa); Greate
Rohit Luthra,

7

Nel mio caso non volevo dipendenze. Usando Java 8 puoi ottenere JSON come una stringa così semplice:

Map<String, Object> map = new HashMap<>();
map.put("key", "value");
map.put("key2", "value2");
String json = "{"+map.entrySet().stream()
    .map(e -> "\""+ e.getKey() + "\"" + ":\"" + String.valueOf(e.getValue()) + "\"")
    .collect(Collectors.joining(", "))+"}";

2
non stai scappando ... se la chiave o il valore contiene ", questo si rompe
Janus Troelsen,

hai ragione, questa soluzione ha alcuni limiti, le mappe nidificate non sono supportate
Andrey Sarul,

7

Puoi semplicemente enumerare la mappa e aggiungere le coppie chiave-valore a JSONObject

Metodo :

private JSONObject getJsonFromMap(Map<String, Object> map) throws JSONException {
    JSONObject jsonData = new JSONObject();
    for (String key : map.keySet()) {
        Object value = map.get(key);
        if (value instanceof Map<?, ?>) {
            value = getJsonFromMap((Map<String, Object>) value);
        }
        jsonData.put(key, value);
    }
    return jsonData;
}

1
nessuna scorciatoia e lavoro efficace senza alcuna libreria aggiuntiva
Maveň

Map.Entry <K, V >> entrySet () è pensato per l'iterazione di una mappa. Leggere le chiavi e cercare la mappa per ciascuna chiave è un modo non ottimale.
Martin,

7

La libreria Underscore-java può convertire la mappa hash o l'elenco di array in json e viceversa.

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

public class Main {

    public static void main(String[] args) {

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("1", "a");
        map.put("2", "b");

        System.out.println(U.toJson(map));
        // {
        //    "1": "a",
        //    "2": "b"
        // }
    }
}

5

In ritardo alla festa, ma ecco il mio GSON scrittore ad hoc per serializzare l'hashmap. Ho dovuto scrivere una mappa di coppie chiave-valore come attributi di stringa json, aspettandomi che uno specifico fosse di tipo intero. Non volevo creare un wrapper JavaBean personalizzato per questo semplice esempio di utilizzo.

La classe GSON JsonWriter è una classe serializzatore facile da usare che contiene alcune funzioni writer.value () fortemente tipizzate.

// write Map as JSON document to http servlet response
Map<String,String> sd = DAO.getSD(123);
res.setContentType("application/json; charset=UTF-8");
res.setCharacterEncoding("UTF-8");
JsonWriter writer = new JsonWriter(new OutputStreamWriter(res.getOutputStream(), "UTF-8"));
writer.beginObject();
for(String key : sd.keySet()) {
    String val = sd.get(key);
    writer.name(key);
    if (key.equals("UniqueID") && val!=null)
        writer.value(Long.parseLong(val));
    else
        writer.value(val);
}
writer.endObject();
writer.close();

Se non fosse necessario nessuno dei tipi personalizzati, avrei potuto usare la funzione toJson (). La libreria gson-2.2.4.jar ha poco meno di 190 KB senza alcuna brutale dipendenza. Facile da usare su qualsiasi app servlet personalizzata o applicazione standalone senza grandi integrazioni del framework.

Gson gson = new Gson(); 
String json = gson.toJson(myMap); 

4

Questo è in genere il lavoro di una libreria Json, non dovresti provare a farlo da solo. Tutte le librerie JSON dovrebbero implementare ciò che stai chiedendo e puoi trovare un elenco delle librerie Java Json su json.org , in fondo alla pagina.


4

Ho trovato un altro modo di gestirlo.

Map obj=new HashMap();    
obj.put("name","sonoo");    
obj.put("age",new Integer(27));    
obj.put("salary",new Double(600000));   
String jsonText = JSONValue.toJSONString(obj);  
System.out.print(jsonText);

Spero che questo ti aiuti.

Grazie.


3

Se è necessario utilizzarlo nel codice.

Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();

3

Per quelli che usano org.json.simple.JSONObject, puoi convertire la mappa in Json String e analizzarla per ottenere il JSONObject.

JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));

3

Meglio essere in ritardo che mai. Ho usato GSON per convertire l'elenco di HashMap in stringa se nel caso in cui si desidera disporre di un elenco serializzato.

List<HashMap<String, String>> list = new ArrayList<>();
HashMap<String,String> hashMap = new HashMap<>();
hashMap.add("key", "value");
hashMap.add("key", "value");
hashMap.add("key", "value");
list.add(hashMap);

String json = new Gson().toJson(list);

Questo jsonproduce[{"key":"value","key":"value","key":"value"}]


Questo non risponde alla domanda. Sta producendo un array JSON, non un oggetto JSON. E qualcun altro ci ha già mostrato come creare un oggetto JSON da una hashmap usando Gson.
Stephen C

Ciao @StephenC, alcuni potrebbero cercare un esempio di array JSON anziché JSON Object poiché il commento in alto ha già fornito la risposta migliore finora. Spero di poter fornire altre risposte relative alla serializzazione tramite GSON. Mi scuso, questa risposta dovrebbe essere pubblicata su una discussione diversa.
Kelly Budol,

Dovremmo scrivere le risposte per le persone che cercano correttamente. Se proviamo a soddisfare le persone che non possono effettuare ricerche pubblicando risposte off-topic, il sito degrada con "rumore" e rende più difficile per le persone che sanno cercare per trovare risposte pertinenti . Se (ora) accetti che questa risposta sia nel posto sbagliato, ti preghiamo di eliminarla.
Stephen C,

1
@KellyBudol buono o cattivo, la tua risposta è ciò che cerco. Grazie Uomo
vd

2

Ecco la mia soluzione a linea singola con GSON:

myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);

2

Questa soluzione funziona con JSON complessi:

public Object toJSON(Object object) throws JSONException {
    if (object instanceof HashMap) {
        JSONObject json = new JSONObject();
        HashMap map = (HashMap) object;
        for (Object key : map.keySet()) {
            json.put(key.toString(), toJSON(map.get(key)));
        }
        return json;
    } else if (object instanceof Iterable) {
        JSONArray json = new JSONArray();
        for (Object value : ((Iterable) object)) {
            json.put(toJSON(value));
        }
        return json;
    }
    else {
        return object;
    }
}

2

usiamo Gson.

Gson gson = new Gson();
Type gsonType = new TypeToken<HashMap>(){}.getType();
String gsonString = gson.toJson(elements,gsonType);

1

Puoi usare XStream: è davvero utile. Vedi gli esempi qui

package com.thoughtworks.xstream.json.test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

public class WriteTest {

    public static void main(String[] args) {

      HashMap<String,String> map = new HashMap<String,String>();
      map.add("1", "a");
      map.add("2", "b");
      XStream xstream = new XStream(new JettisonMappedXmlDriver());

      System.out.println(xstream.toXML(map));       

    }

}

Ma dovresti mettere in cache il tuo oggetto xstream chiunque
Joost

1

Se stai usando net.sf.json.JSONObject, non troverai un JSONObject(map)costruttore in esso. Devi usare il public static JSONObject fromObject( Object object )metodo Questo metodo accetta stringhe in formato JSON, Maps, DynaBeans e JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);


1

Se si utilizzano oggetti complessi, è necessario applicare enableComplexMapKeySerialization () , come indicato in https://stackoverflow.com/a/24635655/2914140 e https://stackoverflow.com/a/26374888/2914140 .

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Map<Point, String> original = new LinkedHashMap<Point, String>();
original.put(new Point(5, 6), "a");
original.put(new Point(8, 8), "b");
System.out.println(gson.toJson(original));

L'output sarà:

{
 "(5,6)": "a",
 "(8,8)": "b"
}

1

Non sono necessarie librerie di analisi Gson o JSON. Basta usare new JSONObject(Map<String, JSONObject>).toString(), ad esempio:

/**
 * convert target map to JSON string
 *
 * @param map the target map
 * @return JSON string of the map
 */
@NonNull public String toJson(@NonNull Map<String, Target> map) {
    final Map<String, JSONObject> flatMap = new HashMap<>();
    for (String key : map.keySet()) {
        try {
            flatMap.put(key, toJsonObject(map.get(key)));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    try {
        // 2 indentSpaces for pretty printing
        return new JSONObject(flatMap).toString(2);
    } catch (JSONException e) {
        e.printStackTrace();
        return "{}";
    }
}

Ingoiare eccezioni e restituire un oggetto vuoto è una cattiva idea.
Stephen C

1
    import org.json.JSONObject;

    HashMap<Object, Object> map = new HashMap<>();
    String[] list={"Grader","Participant"};
    String[] list1={"Assistant","intern"};
    map.put("TeachingAssistant",list);
    map.put("Writer",list1);
    JSONObject jsonObject = new JSONObject(map);
    System.out.printf(jsonObject.toString());

    // Result: {"TeachingAssistant":["Grader","Participant"],"Writer":["Assistant","intern"]}

Si tratta semplicemente di ripetere una risposta precedente.
Stephen C

1

Se non hai davvero bisogno di HashMap, puoi fare qualcosa del genere:

String jsonString = new JSONObject() {{
  put("firstName", user.firstName);
  put("lastName", user.lastName);
}}.toString();

Produzione:

{
  "firstName": "John",
  "lastName": "Doe"
}

Beh si. Tuttavia, la domanda richiede un modo per creare un oggetto JSON a partire da aHashMap e questo non risponde.
Stephen C

Alcune persone potrebbero atterrare qui da Google alla ricerca di una soluzione generica. La risposta sopra potrebbe aiutarli.
Rafal Enden,

1

Sto usando Alibaba Fastjson, facile e semplice:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>VERSION_CODE</version>
</dependency>

e importazione:

import com.alibaba.fastjson.JSON;

Poi:

String text = JSON.toJSONString(obj); // serialize
VO vo = JSON.parseObject("{...}", VO.class); //unserialize

Va tutto bene.


1

Se stai usando JSR 374: API Java per l'elaborazione JSON (javax json) Questo sembra fare il trucco:

    JsonObjectBuilder job = Json.createObjectBuilder((Map<String, Object>) obj);
    JsonObject jsonObject = job.build();

0

Puoi usare Gson . Questa libreria fornisce metodi semplici per convertire oggetti Java in oggetti JSON e viceversa.

Esempio:

GsonBuilder gb = new GsonBuilder();
Gson gson = gb.serializeNulls().create();
gson.toJson(object);

È possibile utilizzare un GsonBuilder quando è necessario impostare opzioni di configurazione diverse da quelle predefinite. Nell'esempio sopra, il processo di conversione serializzerà anche gli attributi null dall'oggetto.

Tuttavia, questo approccio funziona solo per tipi non generici. Per i tipi generici è necessario utilizzare toJson (oggetto, Tipo).

Maggiori informazioni su Gson qui .

Ricordare che l'oggetto deve implementare l' interfaccia Serializable .


0

questo funziona per me:

import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")

println new JsonBuilder(properties).toPrettyString()

1
Questa non è una domanda Groovy.
Stephen C

@ stephen-c java è una piattaforma non solo linguaggio, groovy è solo un barattolo.
jiahut,

Il codice nella tua domanda non è Java. Se quel codice funziona davvero per te, allora non stai usando Java. Java non ha un'istruzione "println" e non puoi dichiarare una variabile del genere. Suppongo che tu stia usando Groovy, ma non ne sono sicuro. Ad ogni modo, raccomandare alle persone di usare le librerie Groovy invece delle librerie Java nel codice Java ... non è una buona idea.
Stephen C,

0

Modo Gson per mappe ed elenchi un po 'più complessi usando il metodo TypeToken.getParameterized :

Abbiamo una mappa che assomiglia a questa:

Map<Long, List<NewFile>> map;

Otteniamo il Tipo usando il metodo getParameterized sopra citato come questo:

Type listOfNewFiles = TypeToken.getParameterized(ArrayList.class, NewFile.class).getType();
Type mapOfList = TypeToken.getParameterized(LinkedHashMap.class, Long.class, listOfNewFiles).getType();

E quindi usa l'oggetto Gson dal metodo Json in questo modo usando l' oggetto mapOfList in questo modo:

Map<Long, List<NewFile>> map = new Gson().fromJson(fileContent, mapOfList);

L'oggetto menzionato NewFile è simile al seguente:

class NewFile
{
    private long id;
    private String fileName;

    public void setId(final long id)
    {
        this.id = id;
    }

    public void setFileName(final String fileName)
    {
        this.fileName = fileName;
    }
}

Il JSON deserializzato si presenta così:

{
  "1": [
    {
      "id": 12232,
      "fileName": "test.html"
    },
    {
      "id": 12233,
      "fileName": "file.txt"
    },
    {
      "id": 12234,
      "fileName": "obj.json"
    }
  ],
 "2": [
    {
      "id": 122321,
      "fileName": "test2.html"
    },
    {
      "id": 122332,
      "fileName": "file2.txt"
    },
    {
      "id": 122343,
      "fileName": "obj2.json"
    }
  ]
}


-1

Ho riscontrato un problema simile durante la deserializzazione della risposta dai comandi personalizzati in selenio. La risposta è stata json, ma il selenio lo traduce internamente in java.util.HashMap [String, Object]

Se hai familiarità con Scala e usi l'API di riproduzione per JSON, potresti trarne vantaggio:

import play.api.libs.json.{JsValue, Json}
import scala.collection.JavaConversions.mapAsScalaMap


object JsonParser {

  def parse(map: Map[String, Any]): JsValue = {
    val values = for((key, value) <- map) yield {
      value match {
        case m: java.util.Map[String, _] @unchecked => Json.obj(key -> parse(m.toMap))
        case m: Map[String, _] @unchecked => Json.obj(key -> parse(m))
        case int: Int => Json.obj(key -> int)
        case str: String => Json.obj(key -> str)
        case bool: Boolean => Json.obj(key -> bool)
      }
    }

    values.foldLeft(Json.obj())((temp, obj) => {
      temp.deepMerge(obj)
    })
  }
}

Piccola descrizione del codice:

Il codice attraversa ricorsivamente l'HashMap fino a trovare i tipi di base (String, Integer, Boolean). Questi tipi di base possono essere inseriti direttamente in un oggetto JsObject. Quando la ricorsione è aperta, il deepmerge concatena gli oggetti creati.

'@unchecked' si occupa degli avvisi di cancellazione del tipo.


Questa non è una domanda alla Scala
Stephen C,

-1

Prima converti tutti i tuoi oggetti in stringhe valide

HashMap<String, String> params = new HashMap<>();
params.put("arg1", "<b>some text</b>");
params.put("arg2", someObject.toString());

Quindi inserire l'intera mappa in un org.json.JSONObject

JSONObject postData = new JSONObject(params);

Ora puoi ottenere il JSON semplicemente chiamando l'oggetto a String

postData.toString()
//{"arg1":"<b>some text<\/b>" "arg2":"object output"}

Crea un nuovo JSONObject

JSONObject o = new JSONObject(postData.toString());

O come array di byte per l'invio tramite HTTP

postData.toString().getBytes("UTF-8");

Questo sta dicendo la stessa cosa delle risposte precedenti di anni fa, senza il vantaggio di essere conciso.
Stephen C

@StephenC Non ho idea di cosa ti
occupi

@StephenC "Come convertire o trasmettere hashmap all'oggetto JSON in Java e convertire nuovamente l'oggetto JSON in stringa JSON?"
G_V,

362 persone (e contando) pensano che stackoverflow.com/a/12155874/139985 risponda alla domanda. Dice fondamentalmente quello che dice la tua risposta senza i fronzoli.
Stephen C,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.