simple - string to json parse java
Cómo convertir una cadena JSON a un Map<String, String> con Jackson JSON (10)
Intento hacer algo como esto pero no funciona:
Map<String, String> propertyMap = new HashMap<String, String>();
propertyMap = JacksonUtils.fromJSON(properties, Map.class);
Pero el IDE dice:
Asignación no verificada
Map to Map<String,String>
¿Cuál es la forma correcta de hacer esto? Solo estoy usando Jackson porque eso es lo que ya está disponible en el proyecto, ¿hay una forma nativa de Java de convertir a / de JSON?
En PHP, simplemente json_decode($str)
y obtendría una matriz. Necesito básicamente lo mismo aquí.
Usando Google''s Gson
¿Por qué no usar el Gson de Google como se menciona here ?
Muy directo e hizo el trabajo por mí:
HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
Aquí está la solución genérica a este problema usando Object Mapper.
public static <K extends Object, V extends Object> Map<K, V> getJsonAsMap(String json, K key, V value) {
try {
ObjectMapper mapper = new ObjectMapper();
TypeReference<Map<K, V>> typeRef = new TypeReference<Map<K, V>>() {
};
return mapper.readValue(json, typeRef);
} catch (Exception e) {
throw new RuntimeException("Couldnt parse json:" + json, e);
}
}
Espero que algún día alguien piense en crear un método util para convertir a cualquier tipo clave / valor de Mapa, por lo tanto esta respuesta :)
Aquí está la solución genérica a este problema.
public static <K extends Object, V extends Object> Map<K, V> getJsonAsMap(String json, K key, V value) {
try {
ObjectMapper mapper = new ObjectMapper();
TypeReference<Map<K, V>> typeRef = new TypeReference<Map<K, V>>() {
};
return mapper.readValue(json, typeRef);
} catch (Exception e) {
throw new RuntimeException("Couldnt parse json:" + json, e);
}
}
Espero que algún día alguien piense en crear un método util para convertir a cualquier tipo clave / valor de Mapa, por lo tanto esta respuesta :)
Conversión de String a JSON Map:
Map<String,String> map = new HashMap<String,String>();
ObjectMapper mapper = new ObjectMapper();
map = mapper.readValue(string, HashMap.class);
La advertencia que recibe se hace por el compilador, no por la biblioteca (o el método de utilidad).
La forma más simple de usar Jackson directamente sería:
HashMap<String,Object> props;
// src is a File, InputStream, String or such
props = new ObjectMapper().readValue(src, new TypeReference<HashMap<String,Object>>() {});
// or:
props = (HashMap<String,Object>) 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);
El método de utilidad que llamas probablemente solo hace algo similar a esto.
Lo siguiente funciona para mí:
Map<String, String> propertyMap = getJsonAsMap(json);
donde getJsonAsMap
se define así:
public HashMap<String, String> getJsonAsMap(String json)
{
try
{
ObjectMapper mapper = new ObjectMapper();
TypeReference<Map<String,String>> typeRef = new TypeReference<Map<String,String>>() {};
HashMap<String, String> result = mapper.readValue(json, typeRef);
return result;
}
catch (Exception e)
{
throw new RuntimeException("Couldnt parse json:" + json, e);
}
}
Tenga en cuenta que esto fallará si tiene objetos secundarios en su json (porque no son un String
, sino que son otro HashMap
), pero funcionarán si su json es una lista de propiedades de valor clave como esta:
{
"client_id": "my super id",
"exp": 1481918304,
"iat": "1450382274",
"url": "http://www.example.com"
}
Prueba TypeFactory
. Aquí está el código para Jackson JSON (2.8.4).
Map<String, String> 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);
Aquí está el código para una versión anterior de Jackson JSON.
Map<String, String> result = new ObjectMapper().readValue(
data, TypeFactory.mapType(HashMap.class, String.class, String.class));
Tengo el siguiente código:
public void testJackson() throws IOException {
ObjectMapper mapper = new ObjectMapper();
File from = new File("albumnList.txt");
TypeReference<HashMap<String,Object>> typeRef
= new TypeReference<HashMap<String,Object>>() {};
HashMap<String,Object> o = mapper.readValue(from, typeRef);
System.out.println("Got " + o);
}
Está leyendo desde un archivo, pero mapper.readValue()
también aceptará un InputStream
y puede obtener un InputStream
de una cadena usando lo siguiente:
new ByteArrayInputStream(astring.getBytes("UTF-8"));
Hay un poco más de explicación sobre el mapeador en mi blog .
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);
Creo que esto resolverá tu problema.
ObjectReader reader = new ObjectMapper().readerFor(Map.class);
Map<String, String> map = reader.readValue("{/"foo/":/"val/"}");
Tenga en cuenta que la instancia del reader
es Thread Safe.