Bagaimana mengkonversi hashmap ke objek JSON di Java

286

Bagaimana cara mengubah atau membuang hashmap ke objek JSON di Java, dan kembali mengonversi objek JSON ke string JSON?

mohan
sumber

Jawaban:

435

Kamu bisa memakai:

new JSONObject(map);

Perhatian: Ini hanya akan berfungsi untuk aMap<String, String>!

Fungsi lain yang bisa Anda dapatkan dari dokumentasinya
http://stleary.github.io/JSON-java/index.html

Ankur
sumber
85
Ini hanya berfungsi untuk String, String map dan bukan String, Object yang kompleks.
slot
2
Anda menempatkan Mapke dalam JSONObjecttapi bagaimana Anda bisa mendapatkan peta ini dari JSONObject?
Yubaraj
1
@Yubi ini mungkin membantu Anda: stackoverflow.com/questions/21720759/convert-jsonobject-to-map
Hannoun Yassir
8
@ Slott tepat untuk versi yang lebih lama. Versi yang lebih baru seperti kitkat berfungsi dengan baik dengan objek yang lebih kompleks seperti HashMap <String, Object> () yang berisi HashMap <String, Object> () sebagai Object. Jadi saya merekomendasikan Gson.
Luismi
Saya hanya mencarinya
Naveed Ahmad
169

Gson juga dapat digunakan untuk membuat serialisasi objek kompleks yang sewenang-wenang.

Inilah cara Anda menggunakannya:

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

Gsonakan secara otomatis mengonversi koleksi ke JSONarray. Gson dapat membuat serial bidang pribadi dan secara otomatis mengabaikan bidang sementara.

rama
sumber
1
Catatan: Ini tidak mempertahankan kunci dengan nilai nol.
Vikas
58

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

keluaran::

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

Anda juga dapat mencoba menggunakan GSON Google. GSON Google adalah perpustakaan terbaik yang tersedia untuk mengonversi Java Objects menjadi representasi JSON mereka.

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

Mohammod Hossain
sumber
2
Maaf untuk penggalian tapi apa yang 2dilakukan di json.toString(2`)
Jack
public String toString (int radix) .toString (2) digunakan untuk representasi String. untuk lebih stackoverflow.com/questions/3615721/…
Mohammod Hossain
11
kelas JSONObject mana ini?
Janus Troelsen
18
Tidak ada metode seperti itu: (new org.json.JSONObject ()). PutAll ();
Zon
50

Anda dapat mengonversi Mapuntuk JSONmenggunakan Jacksonsebagai berikut:

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

Ketergantungan Maven untuk 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>

Jika Anda menggunakan JSONObjectperpustakaan, Anda dapat mengonversi peta menjadi JSONsebagai berikut:

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

Ketergantungan Maven untuk JSONObject:

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

Semoga ini bisa membantu. Selamat coding.

Ankur Mahajan
sumber
1
tidak tahu saya bisa lulus Peta sebagai argumen, terima kasih, banyak membantu.
Gurkha
@Gurkha Terima kasih telah menghargai.
Ankur Mahajan
1
@AnkurMahajan +1 karena memberikan jawaban yang tepat dengan ketergantungan :)
Badman
1
String json = ObjectMapper baru (). WriteValueAsString (peta); Greate
Rohit Luthra
7

Dalam kasus saya, saya tidak ingin ada ketergantungan. Menggunakan Java 8 Anda bisa mendapatkan JSON sebagai string ini sesederhana ini:

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(", "))+"}";
Andrey Sarul
sumber
2
Anda tidak melarikan diri ... jika kunci atau nilainya berisi ", ini rusak
Janus Troelsen
Anda benar, solusi ini memiliki batasan tertentu, peta bersarang juga tidak didukung
Andrey Sarul
7

Anda bisa menghitung peta dan menambahkan pasangan nilai kunci ke JSONObject

Metode :

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;
}
Tidak ada
sumber
1
tidak ada jalan pintas dan bekerja secara efektif tanpa perpustakaan tambahan
Maveň ツ
Map.Entry <K, V >> entrySet () dimaksudkan untuk iterasi peta. Membaca kunci dan mencari peta untuk setiap tombol adalah cara yang tidak optimal.
Martin
7

Pustaka underscore-java dapat mengonversi peta hash atau daftar larik menjadi json dan sebaliknya.

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"
        // }
    }
}
Valentyn Kolesnikov
sumber
5

Terlambat ke pesta tetapi di sini adalah GSON saya penulis adhoc untuk membuat serial hashmap. Saya harus menulis peta pasangan kunci-nilai sebagai atribut string json, berharap satu spesifik menjadi tipe integer. Saya tidak ingin membuat pembungkus JavaBean khusus untuk penggunaan sederhana ini.

Kelas GSON JsonWriter mudah digunakan kelas serializer yang berisi beberapa fungsi writer.value () sangat diketik.

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

Jika tidak ada jenis kustom yang diperlukan, saya bisa menggunakan fungsi toJson () saja. perpustakaan gson-2.2.4.jar hanya di bawah 190KB tanpa ketergantungan brutal. Mudah digunakan pada aplikasi servlet khusus atau aplikasi mandiri tanpa integrasi kerangka besar.

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

Ini biasanya karya perpustakaan Json, Anda sebaiknya tidak mencoba melakukannya sendiri. Semua pustaka json harus mengimplementasikan apa yang Anda minta, dan Anda dapat menemukan daftar pustaka Java Json di json.org , di bagian bawah halaman.

Jolivier
sumber
4

Saya menemukan cara lain untuk menanganinya.

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

Semoga ini membantu.

Terima kasih.

IMJS
sumber
3

Jika Anda perlu menggunakannya dalam kode.

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

Bagi yang menggunakan org.json.simple.JSONObject, Anda bisa mengonversi peta menjadi Json String dan menguraikannya untuk mendapatkan JSONObject.

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

Lebih baik terlambat daripada tidak pernah sama sekali. Saya menggunakan GSON untuk mengonversi daftar HashMap ke string jika jika Anda ingin memiliki daftar serial.

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

Ini jsonmenghasilkan[{"key":"value","key":"value","key":"value"}]

Kelly Budol
sumber
Ini tidak menjawab pertanyaan. Ini menghasilkan array JSON, bukan objek JSON. Dan orang lain telah menunjukkan kepada kita cara membuat objek JSON dari menggunakan hashmap Gson.
Stephen C
Hai @StephenC, beberapa mungkin mencari contoh array JSON daripada JSON Object karena komentar teratas telah memberikan jawaban terbaik sejauh ini. Saya harap kami dapat memberikan jawaban lain terkait dengan serialisasi menggunakan GSON. Maaf, jawaban ini harus diposting di utas yang berbeda.
Kelly Budol
Kami harus menulis jawaban untuk orang yang mencari dengan benar. Jika kami mencoba melayani orang-orang yang tidak dapat mencari dengan memposting jawaban di luar topik, itu akan menurunkan situs dengan "noise", dan mempersulit orang-orang yang tahu bagaimana mencari untuk menemukan jawaban yang relevan . Jika Anda (sekarang) setuju bahwa Jawaban ini ada di tempat yang salah, harap hapus saja.
Stephen C
1
@KellyBudol baik atau buruk, jawaban Anda adalah apa yang saya cari. Terima kasih Man
vd
2

Di sini solusi single-line saya dengan GSON:

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

Solusi ini bekerja dengan JSONs kompleks:

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;
    }
}
RiccardoCh
sumber
2

kami menggunakan Gson.

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

Anda dapat menggunakan XStream - ini sangat berguna. Lihat contoh di sini

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

    }

}
aviad
sumber
Tetapi Anda harus men-cache siapa pun objek xstream Anda
Joost
1

Jika Anda menggunakan net.sf.json.JSONObjectmaka Anda tidak akan menemukan JSONObject(map)konstruktor di dalamnya. Anda harus menggunakan public static JSONObject fromObject( Object object )metode ini. Metode ini menerima string berformat JSON, Maps, DynaBeans dan JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);

Zeeshan
sumber
1

Jika Anda menggunakan objek yang kompleks, Anda harus menerapkan enableComplexMapKeySerialization () , seperti yang dinyatakan dalam https://stackoverflow.com/a/24635655/2914140 dan 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));

Output akan menjadi:

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

Tidak perlu parsing pustaka Gson atau JSON. Hanya menggunakan new JSONObject(Map<String, JSONObject>).toString(), misalnya:

/**
 * 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 "{}";
    }
}
drakeet
sumber
Menelan pengecualian dan mengembalikan benda kosong adalah ide yang buruk.
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"]}
pushya
sumber
Ini hanya mengulangi jawaban sebelumnya.
Stephen C
1

Jika Anda tidak benar-benar membutuhkan HashMap maka Anda dapat melakukan sesuatu seperti itu:

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

Keluaran:

{
  "firstName": "John",
  "lastName": "Doe"
}
Rafal Enden
sumber
Baiklah. Namun, pertanyaannya meminta cara untuk membuat objek JSON mulai dariHashMap , dan ini tidak menjawab itu.
Stephen C
Beberapa orang dapat mendarat di sini dari google mencari solusi umum. Jawaban di atas mungkin membantu mereka.
Rafal Enden
1

Saya menggunakan fastjson Alibaba, mudah dan sederhana:

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

dan impor:

import com.alibaba.fastjson.JSON;

Kemudian:

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

Semuanya baik-baik saja.

Gali
sumber
1

Jika Anda menggunakan JSR 374: Java API untuk JSON Processing (javax json) Ini sepertinya melakukan trik:

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

Anda dapat menggunakan Gson . Pustaka ini menyediakan metode sederhana untuk mengonversi objek Java ke objek JSON dan sebaliknya.

Contoh:

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

Anda dapat menggunakan GsonBuilder saat Anda perlu mengatur opsi konfigurasi selain yang standar. Pada contoh di atas, proses konversi juga akan membuat cerita bersambung atribut nol dari objek.

Namun, pendekatan ini hanya berfungsi untuk tipe non-generik. Untuk tipe generik Anda perlu menggunakan toJson (objek, Type).

Informasi lebih lanjut tentang Gson di sini .

Ingat bahwa objek harus mengimplementasikan antarmuka Serializable .

Eduardo Melo
sumber
0

ini bekerja untuk saya:

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

println new JsonBuilder(properties).toPrettyString()
jiahut
sumber
1
Ini bukan pertanyaan Groovy.
Stephen C
@ stephen-c java adalah platform bukan hanya bahasa, asyik hanyalah sebuah toples.
jiahut
Kode dalam pertanyaan Anda bukan Java. Jika kode itu benar-benar berfungsi untuk Anda, maka Anda tidak menggunakan Java. Java tidak memiliki pernyataan "println", dan Anda tidak dapat mendeklarasikan variabel seperti itu. Dugaan saya adalah bahwa Anda menggunakan Groovy, tapi saya tidak yakin. Either way, merekomendasikan orang untuk menggunakan perpustakaan Groovy, bukan perpustakaan Java dalam kode Java ... bukan ide yang baik.
Stephen C
0

Jalan gson untuk peta dan daftar sedikit lebih kompleks menggunakan metode TypeToken.getParameterized :

Kami memiliki peta yang terlihat seperti ini:

Map<Long, List<NewFile>> map;

Kami mendapatkan Type menggunakan metode getParameter yang disebutkan di atas seperti ini:

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

Dan kemudian gunakan objek Gson dari metode Json seperti ini menggunakan objek mapOfList seperti ini:

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

Objek yang disebutkan NewFile terlihat seperti ini:

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

JSON deserialized terlihat seperti ini:

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

Rok t.
sumber
-1

Saya menghadapi masalah yang sama ketika deserializing Respon dari perintah khusus di selenium. Responsnya adalah json, tetapi selenium menerjemahkannya secara internal ke java.util.HashMap [String, Object]

Jika Anda terbiasa dengan scala dan menggunakan play-API untuk JSON, Anda dapat mengambil manfaat dari ini:

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

Deskripsi kode kecil:

Kode secara rekursif melintasi HashMap hingga tipe dasar (String, Integer, Boolean) ditemukan. Tipe dasar ini dapat langsung dibungkus menjadi JsObject. Ketika rekursi dibuka, deepmerge menggabungkan objek yang dibuat.

'@blocked' menangani peringatan penghapusan tipe.

Amras
sumber
Ini bukan pertanyaan Scala
Stephen C
-1

Konversikan terlebih dahulu semua objek Anda menjadi String yang valid

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

Kemudian masukkan seluruh peta ke dalam org.json.JSONObject

JSONObject postData = new JSONObject(params);

Sekarang Anda bisa mendapatkan JSON hanya dengan memanggil toString objek

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

Buat JSONObject baru

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

Atau sebagai array byte untuk mengirim melalui HTTP

postData.toString().getBytes("UTF-8");
G_V
sumber
Ini mengatakan hal yang sama dengan jawaban sebelumnya dari tahun yang lalu, tanpa keuntungan menjadi ringkas.
Stephen C
@StephenC Saya tidak tahu apa yang sedang Anda
bicarakan
@StephenC "Bagaimana cara mengubah atau membuang hashmap ke objek JSON di Java, dan sekali lagi mengkonversi objek JSON ke string JSON?"
G_V
362 orang (dan terus bertambah) berpikir bahwa stackoverflow.com/a/12155874/139985 menjawab pertanyaan. Itu pada dasarnya mengatakan apa jawaban Anda tanpa potongan berenda.
Stephen C