Como converter uma string JSON em um Map com Jackson JSON

Estou tentando fazer algo assim, mas não funciona:

Map propertyMap = new HashMap(); propertyMap = JacksonUtils.fromJSON(properties, Map.class); 

Mas o IDE diz:

Atribuição não verificada Map to Map

Qual é o jeito certo de fazer isso? Eu só estou usando Jackson porque é isso que já está disponível no projeto, existe uma maneira Java nativa de converter de / para JSON?

Em PHP eu simplesmente usaria json_decode($str) e eu voltaria com um array. Eu preciso basicamente da mesma coisa aqui.

Eu tenho o seguinte código:

 public void testJackson() throws IOException { ObjectMapper mapper = new ObjectMapper(); File from = new File("albumnList.txt"); TypeReference> typeRef = new TypeReference>() {}; HashMap o = mapper.readValue(from, typeRef); System.out.println("Got " + o); } 

Ele está lendo de um arquivo, mas o mapper.readValue() também aceita um InputStream e você pode obter um InputStream de uma string usando o seguinte:

 new ByteArrayInputStream(astring.getBytes("UTF-8")); 

Há um pouco mais de explicação sobre o mapeador no meu blog .

Tente TypeFactory . Aqui está o código para Jackson JSON (2.8.4).

 Map result; ObjectMapper mapper; TypeFactory factory; MapType type; factory = TypeFactory.defaultInstance(); type = factory.constructMapType(HashMap.class, String.class, String.class); mapper = new ObjectMapper(); result = mapper.readValue(data, type); 

Aqui está o código para uma versão mais antiga do Jackson JSON.

 Map result = new ObjectMapper().readValue( data, TypeFactory.mapType(HashMap.class, String.class, String.class)); 

O aviso que você recebe é feito pelo compilador, não pela biblioteca (ou método utilitário).

Maneira mais simples usando Jackson diretamente seria:

 HashMap props; // src is a File, InputStream, String or such props = new ObjectMapper().readValue(src, new TypeReference>() {}); // or: props = (HashMap) new ObjectMapper().readValue(src, HashMap.class); // or even just: @SuppressWarnings("unchecked") // suppresses typed/untype mismatch warnings, which is harmless props = new ObjectMapper().readValue(src, HashMap.class); 

O método utilitário que você chama provavelmente faz algo semelhante a isso.

 ObjectReader reader = new ObjectMapper().readerFor(Map.class); Map map = reader.readValue("{\"foo\":\"val\"}"); 

Observe que a instância do reader é Segura para Thread.

Convertendo da String para o Mapa JSON:

 Map map = new HashMap(); ObjectMapper mapper = new ObjectMapper(); map = mapper.readValue(string, HashMap.class); 
 JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class); Map map=objectMapper.readValue(jsonStr, javaType); 

Eu acho que isso vai resolver o seu problema.

O seguinte funciona para mim:

 Map propertyMap = getJsonAsMap(json); 

onde getJsonAsMap é definido da seguinte forma:

 public HashMap getJsonAsMap(String json) { try { ObjectMapper mapper = new ObjectMapper(); TypeReference> typeRef = new TypeReference>() {}; HashMap result = mapper.readValue(json, typeRef); return result; } catch (Exception e) { throw new RuntimeException("Couldnt parse json:" + json, e); } } 

Note que isso falhará se você tiver objects filhos no seu json (porque eles não são um String , eles são outro HashMap ), mas funcionarão se o seu json for uma lista de valores de chaves de propriedades da seguinte forma:

 { "client_id": "my super id", "exp": 1481918304, "iat": "1450382274", "url": "http://www.example.com" } 

Usando o Gson do Google

Por que não usar o Gson do Google, como mencionado aqui ?

Muito direto e fez o trabalho para mim:

 HashMap map = new Gson().fromJson( yourJsonString, new TypeToken>(){}.getType()); 

Aqui está a solução genérica para esse problema.

 public static  Map getJsonAsMap(String json, K key, V value) { try { ObjectMapper mapper = new ObjectMapper(); TypeReference> typeRef = new TypeReference>() { }; return mapper.readValue(json, typeRef); } catch (Exception e) { throw new RuntimeException("Couldnt parse json:" + json, e); } } 

Espero que algum dia alguém pense em criar um método util para converter em qualquer tipo de Key / value do Mapa, portanto, esta resposta 🙂

Aqui está a solução genérica para esse problema usando o mapeador de objects.

 public static  Map getJsonAsMap(String json, K key, V value) { try { ObjectMapper mapper = new ObjectMapper(); TypeReference> typeRef = new TypeReference>() { }; return mapper.readValue(json, typeRef); } catch (Exception e) { throw new RuntimeException("Couldnt parse json:" + json, e); } } 

Espero que algum dia alguém pense em criar um método util para converter em qualquer tipo de Key / value do Mapa, portanto, esta resposta 🙂