Como converter hashmap em objeto JSON em Java

286

Como converter ou converter hashmap em objeto JSON em Java e converter novamente objeto JSON em string JSON?

mohan
fonte

Respostas:

435

Você pode usar:

new JSONObject(map);

Cuidado: Isso funcionará apenas para umMap<String, String>!

Outras funções que você pode obter na documentação
http://stleary.github.io/JSON-java/index.html

Ankur
fonte
85
Isso funciona apenas para um mapa String, String e não para um String, Object complexo.
Slott
2
Você está colocando Mapem JSONObject, mas como você pode obter este mapa de JSONObject?
Yubaraj
1
@Yubi isso pode ajudar você: stackoverflow.com/questions/21720759/convert-jsonobject-to-map
Hannoun Yassir
8
O @slott é adequado para versões mais antigas. Versões mais recentes, como kitkat, estão funcionando bem com objetos mais complexos, como HashMap <String, Object> () que contém HashMap <String, Object> () como Objeto. Então, eu recomendo o Gson.
Luismi
Eu estava apenas procurando por isso
Naveed Ahmad 8/17
169

O Gson também pode ser usado para serializar objetos arbitrariamente complexos.

Aqui está como você o usa:

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

Gsonconverterá automaticamente coleções em JSONmatrizes. O Gson pode serializar campos particulares e ignora automaticamente campos transitórios.

rama
fonte
1
Nota: Isso não preserva chaves com valores nulos.
Vikas
58

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

resultado::

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

Você também pode tentar usar o GSON do Google. O GSON do Google é a melhor biblioteca disponível para converter objetos Java em sua representação JSON.

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

Mohammod Hossain
fonte
2
Desculpem a escavação, mas o que faz 2o json.toString(2`)
Jack
public String toString (int radix) .toString (2) é usado para representação de String. para mais stackoverflow.com/questions/3615721/…
Mohammod Hossain
11
qual classe JSONObject é essa?
Janus Troelsen
18
Não existe esse método: (new org.json.JSONObject ()). PutAll ();
Zon
50

Você pode converter Mappara JSONusar da Jacksonseguinte maneira:

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

Dependências do 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>

Se você estiver usando a JSONObjectbiblioteca, poderá converter o mapa da JSONseguinte maneira:

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

Dependências do Maven para JSONObject:

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

Espero que isso ajude. Feliz codificação.

Ankur Mahajan
fonte
1
não sabia que posso passar o mapa como argumento, obrigado, ajudou muito.
precisa
@Gurkha Obrigado por apreciar.
Ankur Mahajan
1
@AnkurMahajan +1 para dar resposta adequada com dependência :)
Badman
1
String json = new ObjectMapper (). WriteValueAsString (map); Greate
Rohit Luthra
7

No meu caso, eu não queria nenhuma dependência. Usando o Java 8, você pode obter JSON como uma string simples:

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
fonte
2
você não está escapando ... se a chave ou valor contém ", este breaks
Janus Troelsen
Você está certo, esta solução tem certas limitaions, mapas aninhados também não é suportado
Andrey Sarul
7

Você pode apenas enumerar o mapa e adicionar os pares de valor-chave ao JSONObject

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
fonte
1
sem atalhos e trabalhar eficazmente sem qualquer biblioteca adicional
Mavenツ
O Map.Entry <K, V >> entrySet () é destinado à iteração de um mapa. Ler as chaves e pesquisar cada mapa no mapa é uma maneira subótima.
Martin
7

A biblioteca Underscore-java pode converter o mapa de hash ou a lista de matrizes em json e vice-verso.

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
fonte
5

Tarde para a festa, mas aqui está o meu escritor adhoc da GSON para serializar o hashmap. Eu tive que escrever um mapa de pares de valores-chave como atributos de string json, esperar que um específico seja do tipo inteiro. Eu não queria criar um wrapper JavaBean personalizado para este simples caso de usuário.

A classe GSON JsonWriter é fácil de usar, a classe serializador, contendo poucas funções writer.value () fortemente tipadas.

// 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 nenhum dos tipos personalizados for necessário, eu poderia usar a função toJson (). A biblioteca gson-2.2.4.jar está abaixo de 190KB, sem nenhuma dependência brutal. Fácil de usar em qualquer aplicativo de servlet personalizado ou aplicativo independente, sem grandes integrações de estrutura.

Gson gson = new Gson(); 
String json = gson.toJson(myMap); 
Quem eu
fonte
4

Normalmente, este é o trabalho de uma biblioteca Json; você não deve tentar fazer isso sozinho. Todas as bibliotecas json devem implementar o que você está solicitando e você pode encontrar uma lista de bibliotecas Java Json em json.org , na parte inferior da página.

jolivier
fonte
4

Eu encontrei outra maneira de lidar com isso.

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 isto ajude.

Obrigado.

IMJS
fonte
3

Se você precisar usá-lo no código.

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

Para aqueles que usam org.json.simple.JSONObject, você pode converter o mapa em Json String e analisá-lo para obter o JSONObject.

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

Melhor chegar atrasado do que nunca. Usei o GSON para converter a lista de HashMap em string, caso você queira ter uma lista serializada.

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

Isso jsonproduz[{"key":"value","key":"value","key":"value"}]

Kelly Budol
fonte
Isso não responde à pergunta. Está produzindo uma matriz JSON, não um objeto JSON. E alguém já nos mostrou como criar um objeto JSON a partir de um hashmap usando Gson.
Stephen C
Olá @StephenC, alguns podem procurar um exemplo de matriz JSON em vez de JSON Object, já que o comentário principal já forneceu a melhor resposta até agora. Espero que possamos fornecer outras respostas relacionadas à serialização usando o GSON. Lamento, esta resposta deve ser postada em um tópico diferente.
Kelly Budol 9/06/19
Deveríamos escrever respostas para pessoas que pesquisam corretamente. Se tentarmos atender a pessoas que não podem pesquisar publicando respostas fora do tópico, ele degradará o site com "ruído" e dificultará as pessoas que sabem pesquisar para encontrar respostas relevantes . Se você (agora) concorda que esta resposta está no lugar errado, exclua-a.
Stephen C
1
@KellyBudol bom ou ruim, sua resposta é o que eu procuro. Obrigado Man
vd
2

Aqui está minha solução de linha única com o GSON:

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

Esta solução funciona com JSONs complexos:

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

nós usamos o Gson.

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

Você pode usar o XStream - é realmente útil. Veja os exemplos aqui

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
fonte
Mas você deve armazenar em cache sua xstream objeto ninguém
Joost
1

Se você estiver usando net.sf.json.JSONObject, não encontrará um JSONObject(map)construtor nele. Você tem que usar o public static JSONObject fromObject( Object object )método Este método aceita seqüências de caracteres formatadas em JSON, Maps, DynaBeans e JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);

Zeeshan
fonte
1

Se você usar objetos complexos, aplique enableComplexMapKeySerialization () , conforme indicado em 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));

A saída será:

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

Não há necessidade de bibliotecas de análise Gson ou JSON. Apenas usando new JSONObject(Map<String, JSONObject>).toString(), por exemplo:

/**
 * 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
fonte
Engolir exceções e retornar um objeto vazio é uma má idéia.
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
fonte
Isso é apenas repetir uma resposta anterior.
Stephen C
1

Se você realmente não precisa do HashMap, pode fazer algo assim:

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

Resultado:

{
  "firstName": "John",
  "lastName": "Doe"
}
Rafal Enden
fonte
Bem, sim. No entanto, a pergunta pede uma maneira de criar um objeto JSON partir de aHashMap , e isso não responde a isso.
Stephen C
Algumas pessoas podem chegar aqui do google procurando uma solução genérica. A resposta acima pode ajudá-los.
Rafal Enden
1

Estou usando o Alibaba fastjson, fácil e simples:

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

e importar:

import com.alibaba.fastjson.JSON;

Então:

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

Está tudo bem.

Galley
fonte
1

Se você estiver usando JSR 374: API Java para processamento JSON (javax json), isso parece fazer o truque:

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

Você pode usar o Gson . Esta biblioteca fornece métodos simples para converter objetos Java em objetos JSON e vice-versa.

Exemplo:

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

Você pode usar um GsonBuilder quando precisar definir opções de configuração diferentes do padrão. No exemplo acima, o processo de conversão também serializará atributos nulos do objeto.

No entanto, essa abordagem funciona apenas para tipos não genéricos. Para tipos genéricos, você precisa usar toJson (objeto, Tipo).

Mais informações sobre Gson aqui .

Lembre-se de que o objeto deve implementar a interface serializável .

Eduardo Melo
fonte
0

isso funciona para mim:

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

println new JsonBuilder(properties).toPrettyString()
jiahut
fonte
1
Esta não é uma pergunta Groovy.
Stephen C
@ stephen-c java é uma plataforma e não apenas linguagem, o groovy é apenas um jarro.
jiahut
O código na sua pergunta não é Java. Se esse código realmente funcionar para você, você não está usando Java. Java não possui uma instrução "println" e você não pode declarar uma variável como essa. Meu palpite é que você está usando o Groovy, mas não tenho certeza. De qualquer maneira, recomendar às pessoas que usem as bibliotecas Groovy em vez das bibliotecas Java no código Java ... não é uma boa ideia.
Stephen C
0

Gson maneira para mapas e listas um pouco mais complexos usando o método TypeToken.getParameterized :

Temos um mapa parecido com este:

Map<Long, List<NewFile>> map;

Obtemos o Type usando o método getParameterized acima mencionado , como este:

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

E, em seguida, use o objeto Gson fromJson método como este usando o objeto mapOfList como este:

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

O objeto mencionado NewFile se parece com isso:

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

O JSON desserializado fica assim:

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

Eu enfrentei um problema semelhante ao desserializar a resposta de comandos personalizados no selênio. A resposta foi json, mas o selênio internamente traduz isso em um java.util.HashMap [String, Object]

Se você estiver familiarizado com o scala e usar a API play para JSON, poderá se beneficiar com isso:

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

Descrição de código pequeno:

O código percorre recursivamente o HashMap até que tipos básicos (String, Inteiro, Booleano) sejam encontrados. Esses tipos básicos podem ser agrupados diretamente em um JsObject. Quando a recursão é desdobrada, o deepmerge concatena os objetos criados.

'@unchecked' cuida dos avisos de exclusão de tipo.

Amras
fonte
Esta não é uma questão Scala
Stephen C
-1

Primeiro converta todos os seus objetos em Strings válidas

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

Em seguida, insira o mapa inteiro em um org.json.JSONObject

JSONObject postData = new JSONObject(params);

Agora você pode obter o JSON simplesmente chamando toString do objeto

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

Crie um novo JSONObject

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

Ou como uma matriz de bytes para enviar por HTTP

postData.toString().getBytes("UTF-8");
G_V
fonte
Isso está dizendo a mesma coisa que as respostas anteriores de anos atrás, sem a vantagem de ser conciso.
Stephen C
@StephenC Eu não tenho ideia do que você está em cerca de
G_V
@StephenC "Como converter ou converter hashmap em objeto JSON em Java e converter novamente objeto JSON em string JSON?"
G_V
362 pessoas (e contando) acham que stackoverflow.com/a/12155874/139985 responde à pergunta. Diz basicamente o que a sua resposta diz sem os babados.
Stephen C