wake-up-neo.com

Wie konvertiert man Hashmap in JSON-Objekt in Java?

Wie kann man Hashmap in JSON-Objekt in Java konvertieren oder konvertieren und JSON-Objekt erneut in JSON-Zeichenfolge konvertieren?

202
mohan

Sie können verwenden:

new JSONObject(map);

Achtung: Dies funktioniert nur für einen Map<String, String>!

Weitere Funktionen können Sie der Dokumentation entnehmen
http://stleary.github.io/JSON-Java/index.html

348
Ankur

Gson kann auch zur Serialisierung von beliebig komplexen Objekten verwendet werden. 

So verwenden Sie es: 

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

Gson konvertiert Sammlungen automatisch in JSON-Arrays. Gson kann private Felder serialisieren und transiente Felder automatisch ignorieren.

124
rama

Beispiel mit 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) );

ausgabe::

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

Sie können auch versuchen, den GSON von Google zu verwenden. Der GSON von Google ist die beste verfügbare Bibliothek, um Java-Objekte in ihre JSON-Darstellung zu konvertieren.

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

51

Sie können Map in JSON konvertieren, indem Sie Jackson wie folgt verwenden:

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

Abhängigkeiten von Maven für 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>

Wenn Sie die Bibliothek JSONObject verwenden, können Sie map wie folgt in JSON konvertieren:

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

Abhängigkeiten von Maven für JSONObject:

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

Hoffe das wird helfen. Glückliche Kodierung.

30
Ankur Mahajan

Sie können die Map einfach auflisten und die Schlüssel-Wert-Paare zum JSONObject hinzufügen

Methode : 

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;
}
5
UnahD

Spät zur Party, aber hier ist mein GSON adhoc-Schreiber für die Serialisierung der Hashmap. Ich musste eine Map von Schlüssel-Wert-Paaren als Json-String-Attribute schreiben. Ein ganzzahliger Typ sollte davon ausgehen. Ich wollte keinen benutzerdefinierten JavaBean-Wrapper für diese einfache Anwendung erstellen. 

Die GSON JsonWriter-Klasse ist einfach zu verwenden, die Serialisierungsklasse, die wenige stark typisierte writer.value () - Funktionen enthält.

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

Wenn keine der benutzerdefinierten Typen benötigt wird, könnte ich einfach die toJson () - Funktion verwenden. Die Bibliothek von gson-2.2.4.jar ist knapp 190 KB ohne brutale Abhängigkeiten. Einfache Verwendung mit jeder benutzerdefinierten Servlet-App oder eigenständigen Anwendung ohne große Framework-Integrationen.

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

Dies ist normalerweise die Arbeit einer Json-Bibliothek. Sie sollten es nicht selbst versuchen. Alle json-Bibliotheken sollten das implementieren, wonach Sie fragen, und Sie können eine Liste der Java-Json-Bibliotheken unter json.org am Ende der Seite finden.

4
jolivier

Ich habe einen anderen Weg gefunden, damit umzugehen.

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

Hoffe das hilft.

Vielen Dank.

3
IMJS

In meinem Fall wollte ich keine Abhängigkeiten. Mit Java 8 können Sie JSON so einfach als Zeichenfolge erhalten:

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(", "))+"}";
3
Andrey Sarul

Für diejenigen, die org.json.simple.JSONObject verwenden, können Sie die Karte in Json String konvertieren und sie analysieren, um die JSONObject zu erhalten.

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

Hier meine einzeilige Lösung mit GSON:

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

Wenn Sie net.sf.json.JSONObject Verwenden, finden Sie keinen JSONObject(map) -Konstruktor darin. Sie müssen die public static JSONObject fromObject( Object object ) -Methode verwenden. Diese Methode akzeptiert JSON-formatierte Zeichenfolgen, Maps, DynaBeans und JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);

1
Zeeshan

Sie können XStream verwenden - es ist wirklich praktisch. Siehe die Beispiele hier

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

    }

}
1
aviad

Wenn Sie es brauchen, verwenden Sie es im Code.

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

Underscore-Java library kann Hash Map- oder Array-Liste in Json konvertieren und umgekehrt.

Code-Beispiel:

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

public class Main {

    public static void main(String[] args) {

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

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

Keine Notwendigkeit für Gson oder JSON-Parsing-Bibliotheken. Verwenden Sie einfach new JSONObject(Map<String, JSONObject>).toString(), z.

/**
 * 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 "{}";
    }
}
1
drakeet

Diese Lösung funktioniert mit komplexen JSONs:

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;
    }
}
1
RiccardoCh
    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"]}
0
pushya

das funktioniert für mich:

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

println new JsonBuilder(properties).toPrettyString()
0
jiahut

Wenn Sie HashMap nicht wirklich brauchen, können Sie so etwas tun:

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

Ausgabe:

{
  "firstName": "John",
  "lastName": "Doe"
}
0
Rafal Enden

Ich benutze Alibaba fastjson, einfach und unkompliziert:

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

und importieren:

import com.alibaba.fastjson.JSON;

Dann:

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

Alles ist ok.

0
Galley

Sie können Gson ..__ verwenden. Diese Bibliothek bietet einfache Methoden zum Konvertieren von Java-Objekten in JSON-Objekte und umgekehrt. 

Beispiel:

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

Sie können einen GsonBuilder verwenden, wenn Sie andere Konfigurationsoptionen als die Standardeinstellungen festlegen müssen. Im obigen Beispiel serialisiert der Konvertierungsprozess auch Nullattribute aus einem Objekt.

Dieser Ansatz funktioniert jedoch nur für nicht generische Typen. Für generische Typen müssen Sie toJson (object, Type) verwenden.

Weitere Informationen zu Gson hier .

Beachten Sie, dass das Objekt die Schnittstelle Serializable implementieren muss.

0
Eduardo Melo

Wenn Sie komplexe Objekte verwenden, sollten Sie enableComplexMapKeySerialization () anwenden, wie in https://stackoverflow.com/a/24635655/2914140 und https://stackoverflow.com/a/ angegeben. 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));

Ausgabe wird sein:

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

Besser spät als nie. Ich habeGSONverwendet, um die HashMap-Liste in eine Zeichenfolge zu konvertieren, falls Sie eine serialisierte Liste haben möchten.

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

Diese json erzeugt [{"key":"value","key":"value","key":"value"}]

0
Kelly Budol

Bei der Deserialisierung der Antwort von benutzerdefinierten Befehlen in Selenium war ich mit einem ähnlichen Problem konfrontiert. Die Antwort war json, aber Selenium übersetzt dies intern in eine Java.util.HashMap [String, Object].

Wenn Sie mit scala vertraut sind und die play-API für JSON verwenden, könnten Sie davon profitieren:

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

Kleine Codebeschreibung:

Der Code durchläuft die HashMap rekursiv, bis Grundtypen (String, Integer, Boolean) gefunden werden. Diese Basistypen können direkt in ein JsObject eingebunden werden. Wenn die Rekursion entfaltet ist, verkettet die Vertiefung die erstellten Objekte.

'@unchecked' sorgt für Warnungen zum Löschen von Typen.

0
Amras