Cómo convertir hashmap a objeto JSON en Java

286

¿Cómo convertir o convertir hashmap a un objeto JSON en Java, y nuevamente convertir un objeto JSON a una cadena JSON?

mohan
fuente

Respuestas:

435

Puedes usar:

new JSONObject(map);

Precaución: esto solo funcionará para unMap<String, String>!

Otras funciones que puede obtener de su documentación
http://stleary.github.io/JSON-java/index.html

Ankur
fuente
85
Esto solo funciona para un String, un mapa de String y no para un String, Object complejo.
slott
2
Usted está poniendo Mapen JSONObjectpero cómo se puede obtener a partir de este mapa JSONObject?
Yubaraj
1
@Yubi esto podría ayudarte: stackoverflow.com/questions/21720759/convert-jsonobject-to-map
Hannoun Yassir
8
@slott es adecuado para versiones anteriores. Las versiones más nuevas como kitkat funcionan bien con objetos más complejos como HashMap <String, Object> () que contienen HashMap <String, Object> () como Object. Por eso recomiendo a Gson.
Luismi
Solo lo estaba buscando
Naveed Ahmad
169

Gson también se puede utilizar para serializar objetos complejos arbitrariamente.

Así es como lo usas:

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

Gsonconvertirá automáticamente las colecciones a JSONmatrices. Gson puede serializar campos privados e ignora automáticamente los campos transitorios.

rama
fuente
1
Nota: Esto no conserva las claves con valores nulos.
Vikas
58

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

salida::

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

También puede intentar usar GSON de Google. GSON de Google es la mejor biblioteca disponible para convertir objetos Java en su representación JSON.

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

Mohammod Hossain
fuente
2
Perdón por la excavación, pero ¿qué hace 2el json.toString(2 ')
Jack
public String toString (int radix) .toString (2) se utiliza para la representación de String. para más stackoverflow.com/questions/3615721/…
Mohammod Hossain
11
¿Qué clase de JSONObject es esta?
Janus Troelsen
18
No existe tal método: (new org.json.JSONObject ()). PutAll ();
Zon
50

Puede convertir Mapa JSONusar de la Jacksonsiguiente manera:

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

Dependencias de Maven para 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>

Si está utilizando la JSONObjectbiblioteca, puede convertir el mapa de la JSONsiguiente manera:

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

Dependencias de Maven para JSONObject:

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

Espero que esto ayude. Feliz codificación

Ankur Mahajan
fuente
1
no sabía que podía pasar Map como argumento, gracias, me ayudó mucho.
Gurkha
@Gurkha Gracias por apreciar.
Ankur Mahajan
1
@AnkurMahajan +1 por dar una respuesta adecuada con dependencia :)
Badman
1
Cadena json = new ObjectMapper (). WriteValueAsString (mapa); Greate
Rohit Luthra
7

En mi caso no quería ninguna dependencia. Usando Java 8 puede obtener JSON como una cadena así de simple:

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
fuente
2
no estás escapando ... si la clave o el valor contienen ", esto se rompe
Janus Troelsen
tienes razón, esta solución tiene ciertas limitaciones, los mapas anidados tampoco son compatibles
Andrey Sarul
7

Simplemente puede enumerar el mapa y agregar los pares clave-valor al objeto JSON

Método:

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;
}
UnahD
fuente
1
sin atajos y trabajando eficazmente sin ninguna biblioteca adicional
Maveň ツ
Map.Entry <K, V >> entrySet () está destinado a la iteración de un mapa. Leer las claves y buscar el mapa para cada clave es una forma subóptima.
Martin
7

La biblioteca Underscore-java puede convertir el mapa hash o la lista de matrices a json y 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"
        // }
    }
}
Valentyn Kolesnikov
fuente
5

Tarde a la fiesta pero aquí está mi GSON escritor ad hoc de para serializar hashmap. Tuve que escribir un mapa de pares clave-valor como atributos de cadena json, espero que uno específico sea de tipo entero. No quería crear un contenedor JavaBean personalizado para este simple caso de uso.

La clase JONWriter de GSON es una clase de serializador fácil de usar que contiene pocas funciones de escritor fuertemente escritas.

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

Si no se necesita ninguno de los tipos personalizados, podría haber usado la función toJson (). La biblioteca gson-2.2.4.jar tiene poco menos de 190 KB sin ninguna dependencia brutal. Fácil de usar en cualquier aplicación de servlet personalizada o aplicación independiente sin grandes integraciones de framework.

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

Este es típicamente el trabajo de una biblioteca Json, no debe intentar hacerlo usted mismo. Todas las bibliotecas json deben implementar lo que está solicitando, y puede encontrar una lista de bibliotecas Java Json en json.org , en la parte inferior de la página.

jolivier
fuente
4

Encontré otra forma de manejarlo.

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

Espero que esto ayude.

Gracias.

IMJS
fuente
3

Si necesita usarlo en el código.

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

Para aquellos que usan org.json.simple.JSONObject, puede convertir el mapa a Json String y analizarlo para obtener el JSONObject.

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

Mejor llegar tarde que nunca. Solía GSON a la lista de conversión de HashMap de cadena si en caso de que quiera tener una lista serializado.

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

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

Kelly Budol
fuente
Esto no responde la pregunta. Produce una matriz JSON, no un objeto JSON. Y alguien más ya nos ha mostrado cómo crear un objeto JSON a partir de un hashmap usando Gson.
Stephen C
Hola @StephenC, algunos podrían estar buscando un ejemplo de matriz JSON en lugar de JSON Object ya que el comentario principal ya ha proporcionado la mejor respuesta hasta ahora. Espero que podamos proporcionar otras respuestas relacionadas con la serialización utilizando GSON. Mis disculpas, esta respuesta debe publicarse en un hilo diferente.
Kelly Budol
Deberíamos estar escribiendo respuestas para las personas que buscan correctamente. Si tratamos de atender a las personas que no pueden buscar publicando respuestas fuera del tema, esto degrada el sitio con "ruido" y hace que sea más difícil para las personas que saben cómo buscar encontrar respuestas relevantes . Si (ahora) acepta que esta respuesta está en el lugar incorrecto, simplemente elimínela.
Stephen C
1
@KellyBudol bueno o malo, su respuesta es lo que estaba buscando. Gracias, hombre
vd
2

Aquí mi solución de línea única con GSON:

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

Esta solución funciona con JSON complejos:

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
fuente
2

Usamos Gson.

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

Puede usar XStream, es realmente útil. Mira los ejemplos aquí

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
fuente
Pero debe almacenar en caché su objeto xstream cualquiera
Joost
1

Si está utilizando, net.sf.json.JSONObjectentonces no encontrará un JSONObject(map)constructor en él. Tienes que usar el public static JSONObject fromObject( Object object )método. Este método acepta cadenas con formato JSON, Maps, DynaBeans y JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);

Zeeshan
fuente
1

Si usa objetos complejos, debe aplicar enableComplexMapKeySerialization () , como se indica en https://stackoverflow.com/a/24635655/2914140 y 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));

La salida será:

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

No hay necesidad de bibliotecas de análisis Gson o JSON. Solo usando new JSONObject(Map<String, JSONObject>).toString(), por ejemplo:

/**
 * 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
fuente
Tragar excepciones y devolver un objeto vacío es una mala 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"]}
Pushya
fuente
Esto es simplemente repetir una respuesta anterior.
Stephen C
1

Si realmente no necesita HashMap, puede hacer algo así:

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

Salida:

{
  "firstName": "John",
  "lastName": "Doe"
}
Rafal Enden
fuente
Bueno, sí. Sin embargo, la pregunta pide una forma de crear un objeto JSON a partir de aHashMap , y esto no responde a eso.
Stephen C
Algunas personas podrían aterrizar aquí desde google buscando una solución genérica. La respuesta anterior podría ayudarlos.
Rafal Enden
1

Estoy usando Alibaba fastjson, fácil y simple:

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

e importar:

import com.alibaba.fastjson.JSON;

Luego:

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

Todo está bien.

Galera
fuente
1

Si está utilizando JSR 374: API Java para el procesamiento JSON (javax json) Esto parece ser el truco:

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

Puedes usar Gson . Esta biblioteca proporciona métodos simples para convertir objetos Java en objetos JSON y viceversa.

Ejemplo:

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

Puede usar un GsonBuilder cuando necesite establecer opciones de configuración distintas a las predeterminadas. En el ejemplo anterior, el proceso de conversión también serializará atributos nulos del objeto.

Sin embargo, este enfoque solo funciona para tipos no genéricos. Para los tipos genéricos, debe usar toJson (objeto, tipo).

Más información sobre Gson aquí .

Recuerde que el objeto debe implementar la interfaz serializable .

Eduardo Melo
fuente
0

esto funciona para mi:

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

println new JsonBuilder(properties).toPrettyString()
jiahut
fuente
1
Esta no es una pregunta maravillosa.
Stephen C
@ stephen-c java es una plataforma no solo lenguaje, groovy es solo un frasco.
jiahut
El código en su pregunta no es Java. Si ese código realmente funciona para usted, entonces no está utilizando Java. Java no tiene una declaración "println", y no puede declarar una variable como esa. Supongo que estás usando Groovy, pero no estoy seguro. De cualquier manera, recomendar a las personas que utilicen las bibliotecas Groovy en lugar de las bibliotecas Java en el código Java ... no es una buena idea.
Stephen C
0

Manera de Gson para mapas y listas un poco más complejos usando el método TypeToken.getParameterized :

Tenemos un mapa que se ve así:

Map<Long, List<NewFile>> map;

Obtenemos el tipo usando el método getParameterized mencionado anteriormente como este:

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

Y luego use el objeto Gson del método Json como este usando el objeto mapOfList como este:

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

El objeto mencionado NewFile se ve así:

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

El JSON deserializado se ve así:

{
  "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.
fuente
-1

Me enfrenté a un problema similar al deserializar la respuesta de los comandos personalizados en selenio. La respuesta fue json, pero el selenio se traduce internamente en java.util.HashMap [String, Object]

Si está familiarizado con scala y utiliza la API de reproducción para JSON, podría beneficiarse de esto:

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

Descripción del código pequeño:

El código atraviesa recursivamente el HashMap hasta que se encuentran tipos básicos (String, Integer, Boolean). Estos tipos básicos se pueden envolver directamente en un JsObject. Cuando se despliega la recursividad, la fusión profunda concatena los objetos creados.

'@unchecked' se encarga de las advertencias de borrado de tipo.

Amras
fuente
Esta no es una pregunta de Scala
Stephen C
-1

Primero convierta todos sus objetos en cadenas válidas

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

Luego inserte todo el mapa en un org.json.JSONObject

JSONObject postData = new JSONObject(params);

Ahora puede obtener el JSON simplemente llamando a toString del objeto

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

Crear un nuevo objeto JSON

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

O como una matriz de bytes para enviar a través de HTTP

postData.toString().getBytes("UTF-8");
G_V
fuente
Esto dice lo mismo que las respuestas anteriores de hace años, sin la ventaja de ser conciso.
Stephen C
@StephenC No tengo idea de lo que estás hablando
G_V
@StephenC "¿Cómo convertir o emitir hashmap a un objeto JSON en Java, y nuevamente convertir un objeto JSON a una cadena JSON?"
G_V
362 personas (y contando) piensan que stackoverflow.com/a/12155874/139985 responde la pregunta. Básicamente dice lo que dice tu respuesta sin las partes con volantes.
Stephen C