Hashmap Java JSON nesnesine dönüştürme


287

Nasıl hashmap Java JSON nesnesine dönüştürmek veya döküm ve yine JSON nesnesini JSON dizeye dönüştürmek için?

Yanıtlar:


435

Kullanabilirsiniz:

new JSONObject(map);

Dikkat: Bu sadece birMap<String, String>!

Dokümanlarından alabileceğiniz diğer fonksiyonlar
http://stleary.github.io/JSON-java/index.html


85
Bu yalnızca bir String, String haritası için çalışır ve karmaşık bir String, Object için çalışmaz.
slott

2
Mapİçine koyuyorsunuz JSONObjectama bu haritayı jsonObject'ten nasıl edinebilirsiniz?
Yubaraj


8
@slott eski sürümler için uygundur. Kitkat gibi yeni sürümler HashMap <String, Object> () gibi HashMap <String, Object> () gibi Object gibi daha karmaşık nesnelerle iyi çalışıyor. Bu yüzden Gson'u tavsiye ederim.
Luismi

Ben sadece onu arıyordum
Naveed Ahmad

169

Gson ayrıca rastgele karmaşık nesneleri serileştirmek için de kullanılabilir.

İşte nasıl kullanacağınız:

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

Gsonkoleksiyonları otomatik olarak JSONdizilere dönüştürür . Gson özel alanları serileştirebilir ve geçici alanları otomatik olarak yok sayar.


1
Not: Bu, null değerlere sahip anahtarları korumaz.
Vikas

58

Json kullanarak örnek

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

çıktı::

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

Google'ın GSON'unu da kullanmayı deneyebilirsiniz. Google'ın GSON'u, Java Nesnelerini JSON temsillerine dönüştürmek için mevcut en iyi kütüphanedir.

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


2
Maalesef kazmak için değil ne 2de do json.toString() 2`ye
Jack

public String toString (int radix) .toString (2), String temsili için kullanılır. Daha fazla bilgi için stackoverflow.com/questions/3615721/…
Mohammod Hossain

11
bu hangi JSONObject sınıfı?
Janus Troelsen

18
Böyle bir yöntem yok: (new org.json.JSONObject ()). PutAll ();
Zon

50

Sen dönüştürebilirsiniz Mapiçin JSONkullanıyor Jacksonşöyle:

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

Maven Bağımlılıkları 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>

JSONObjectKütüphane kullanıyorsanız , haritayı JSONaşağıdaki gibi dönüştürebilirsiniz :

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

Maven Bağımlılıkları JSONObject:

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

Umarım bu yardımcı olur. Mutlu kodlama.


1
Harita'yı bir tartışma olarak geçirebileceğimi bilmiyordum, teşekkürler, çok yardımcı oldu.
Gurkha

@Gurkha Takdir ettiğiniz için teşekkürler.
Ankur Mahajan

1
@AnkurMahajan +1 bağımlılık ile uygun cevap vermek için :)
Badman

1
String json = yeni ObjectMapper (). WriteValueAsString (harita); Greate
Rohit Luthra

7

Benim durumumda herhangi bir bağımlılık istemedim. Java 8'i kullanarak JSON'u bu kadar basit bir dize olarak alabilirsiniz:

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
kaçmıyorsunuz ... Eğer anahtar veya değer içeriyorsa ", bu kırılır
Janus Troelsen

haklısın, bu çözümün bazı sınırlamaları var, iç içe haritalar da desteklenmiyor
Andrey Sarul

7

Sadece haritayı numaralandırabilir ve anahtar / değer çiftlerini JSONObject öğesine ekleyebilirsiniz.

Yöntem :

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
kısayol yok ve herhangi bir ek kütüphane olmadan etkili bir şekilde çalışıyor
Maveň ツ

Map.Entry <K, V >> entrySet (), bir haritanın yinelenmesi içindir. Anahtarları okumak ve her anahtar için haritayı aramak yetersiz bir yoldur.
Martin

7

Alt çizgi-java kütüphanesi karma harita veya dizi listesini json ve ayet'e dönüştürebilir.

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

Partiye geç kaldım ama işte, hashumu serileştirmek için GSON geçici yazarım. Anahtar-değer çiftlerinin haritası json string öznitelikleri olarak yazmak zorunda kaldım, belirli bir tamsayı türü olmasını bekliyorum. Bu basit kullanım için özel JavaBean sarmalayıcısı oluşturmak istemedim.

GSON JsonWriter sınıfının, güçlü yazılan birkaç writer.value () işlevi içeren serileştirici sınıfı kullanımı kolaydır.

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

Özel türlerin hiçbirine ihtiyaç duyulmazsa, sadece toJson () işlevini kullanabilirdim. gson-2.2.4.jar kütüphanesi acımasız bağımlılıklar olmadan 190 KB'ın hemen altındadır. Büyük çerçeve entegrasyonları olmadan herhangi bir özel sunucu uygulaması veya bağımsız uygulamada kullanımı kolaydır.

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

4

Bu genellikle bir Json kütüphanesinin çalışmasıdır, kendiniz yapmaya çalışmamalısınız. Tüm json kütüphaneleri, istediğinizi uygulamalıdır ve json.org'da sayfanın alt kısmında Java Json kütüphanelerinin bir listesini bulabilirsiniz .


4

Bununla başa çıkmanın başka bir yolunu buldum.

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

Bu yardımcı olur umarım.

Teşekkürler.


3

Kodda kullanmanız gerekiyorsa.

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

3

Kullananlar için org.json.simple.JSONObject, haritayı Json String'e dönüştürebilir ve almak için ayrıştırabilirsiniz JSONObject.

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

3

Asla geç kalmasan iyi olur. Serileştirilmiş bir listeye sahip olmak istiyorsanız, HashMap listesini dizeye dönüştürmek için GSON kullandım .

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

Bu jsonüretir[{"key":"value","key":"value","key":"value"}]


Bu soruya cevap vermiyor. JSON nesnesi değil, JSON dizisi üretiyor. Ve bir başkası bize zaten hashmap kullanarak nasıl JSON nesnesi oluşturulacağını gösterdi Gson.
Stephen C

Merhaba @StephenC, bazıları en iyi yorum şimdiye kadar en iyi cevabı sağladığından JSON nesnesi yerine JSON dizisinin bir örneğini arıyor olabilir. Umarım GSON kullanarak serileştirme ile ilgili diğer cevapları sağlayabiliriz. Özür dilerim, bu cevap farklı bir konuya gönderilmelidir.
Kelly Budol

Doğru arama yapan kişiler için cevaplar yazmalıyız. Konu dışı cevaplar göndererek arama yapamayan kişilere hitap etmeye çalışırsak, siteyi "gürültü" ile düşürür ve alakalı yanıtları nasıl arayacağını bilen kişiler için zorlaştırır . Bu cevabın yanlış yerde olduğunu (şimdi) kabul ediyorsanız, lütfen silin.
Stephen C

1
@KellyBudol iyi ya da kötü, cevabın aradığım şey. Teşekkürler Adam
vd

2

İşte GSON ile tek hat çözümüm:

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

2

Bu çözüm karmaşık JSON'larla çalışır:

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

Gson kullanıyoruz.

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

1

XStream kullanabilirsiniz - gerçekten kullanışlı. Buradaki örneklere bakın

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

    }

}

Ama xstream nesnesini önbelleğe almalısın
Joost

1

Kullanıyorsanız, içinde net.sf.json.JSONObjectbir JSONObject(map)kurucu bulamazsınız . public static JSONObject fromObject( Object object )Yöntemi kullanmalısınız . Bu yöntem JSON biçimli dizeleri, Haritalar, DynaBeans ve JavaBeans kabul eder.

JSONObject jsonObject = JSONObject.fromObject(myMap);


1

Karmaşık nesneler kullanıyorsanız, https://stackoverflow.com/a/24635655/2914140 ve https://stackoverflow.com/a/26374888/2914140 ' da belirtildiği gibi enableComplexMapKeySerialization () uygulamanız gerekir .

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

Çıktı:

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

1

Gson veya JSON ayrıştırma kitaplıklarına gerek yoktur. Sadece kullanarak new JSONObject(Map<String, JSONObject>).toString(), örneğin:

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

İstisnaları yutmak ve boş bir nesneyi döndürmek kötü bir fikirdir.
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"]}

Bu sadece daha önceki bir cevabı tekrarlıyor.
Stephen C

1

HashMap'e gerçekten ihtiyacınız yoksa, böyle bir şey yapabilirsiniz:

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

Çıktı:

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

İyi evet. Ancak, soru, a'dan başlayarakHashMap bir JSON nesnesi oluşturmanın bir yolunu sorar ve bu yanıt vermez.
Stephen C

Bazı insanlar genel bir çözüm bulmak için google buraya gelebilir. Yukarıdaki cevap onlara yardımcı olabilir.
Rafal Enden

1

Alibaba fastjson'u kullanıyorum, kolay ve basit:

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

ve içe aktar:

import com.alibaba.fastjson.JSON;

Sonra:

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

Her şey yolunda.


1

JSR 374: JSON İşleme için Java API (javax json) kullanıyorsanız Bu hile gibi görünüyor:

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

0

Gson'u kullanabilirsiniz . Bu kütüphane, Java nesnelerini JSON nesnelerine dönüştürmek için basit yöntemler sağlar.

Misal:

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

Varsayılandan farklı yapılandırma seçeneklerini ayarlamanız gerektiğinde bir GsonBuilder kullanabilirsiniz. Yukarıdaki örnekte, dönüştürme işlemi nesneden boş nitelikleri serileştirecektir.

Ancak, bu yaklaşım yalnızca jenerik olmayan tipler için geçerlidir. Genel türler için toJson (nesne, Tür) kullanmanız gerekir.

Gson hakkında daha fazla bilgi burada .

Nesnenin Serializable arabirimini uygulaması gerektiğini unutmayın .


0

bu benim için çalışıyor:

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

println new JsonBuilder(properties).toPrettyString()

1
Bu harika bir soru değil.
Stephen C

@ stephen-c java sadece bir dil değil, harika bir kavanoz.
jiahut

Sorunuzdaki kod Java değil. Bu kod gerçekten işe yarıyorsa, Java kullanmıyorsunuz demektir. Java'nın "println" ifadesi yoktur ve böyle bir değişkeni bildiremezsiniz. Tahminimce Groovy kullanıyorsunuz ama emin değilim. Her iki durumda da, insanların Java kodunda Java kütüphaneleri yerine Groovy kütüphanelerini kullanmalarını tavsiye etmek ... iyi bir fikir değil.
Stephen C

0

Biraz kullanarak daha karmaşık haritalar ve listeler için GSON yolu TypeToken.getParameterized yöntem:

Şöyle bir haritamız var:

Map<Long, List<NewFile>> map;

Type'ı yukarıda belirtilen getParameterized yöntemini kullanarak şu şekilde elde ederiz:

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

Ve sonra bu gibi mapOfList nesnesini kullanarak Gson nesnesini fromJson yöntemini kullanın :

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

Bahsedilen NewFile nesnesi şöyle görünür:

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

Deserialized JSON şöyle görünür:

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

Selenyum'daki özel komutların Yanıtını serileştirirken benzer bir sorunla karşılaştım. Yanıt json'du, ancak selenyum bunu dahili olarak bir java.util.HashMap [String, Object] haline çevirir

Scala'yı biliyorsanız ve JSON için play-API'yi kullanıyorsanız, bundan faydalanabilirsiniz:

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

Küçük kod açıklaması:

Temel türler (String, Integer, Boolean) bulunana kadar kod, HashMap üzerinden özyinelemeli olarak geçer. Bu temel türler doğrudan bir JsObject içine sarılabilir. Özyineleme açıldığında, derinleştirme oluşturulan nesneleri birleştirir.

'@unchecked' tip silme uyarılarına dikkat eder.


Bu bir Scala sorusu değil
Stephen C

-1

Öncelikle tüm nesnelerinizi geçerli Dizelere dönüştürün

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

Ardından haritanın tamamını bir org.json.JSONObject dosyasına ekleyin

JSONObject postData = new JSONObject(params);

Artık sadece nesnenin toString'ini çağırarak JSON'u alabilirsiniz

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

Yeni bir JSONObject oluştur

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

Veya HTTP üzerinden göndermek için bir bayt dizisi olarak

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

Bu, özlü olmanın avantajı olmadan, yıllar önceki önceki cevaplarla aynı şeyi söylüyor.
Stephen C

@StephenC Ne hakkında olduğunu bilmiyorum
G_V

@StephenC "Nasıl hashmap Java JSON nesnesine dönüştürmek veya döküm ve yine JSON nesnesini JSON dizeye dönüştürmek?"
G_V

362 kişi (ve sayıyor) stackoverflow.com/a/12155874/139985'in soruyu cevapladığını düşünüyor . Temel olarak cevabınız fırfırlı bitler olmadan ne diyor.
Stephen C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.