Comment convertir une chaîne JSON en une carte avec Jackson JSON
J'essaie de faire quelque chose comme ça mais ça ne marche pas:
Map<String, String> propertyMap = new HashMap<String, String>();
propertyMap = JacksonUtils.fromJSON(properties, Map.class);
Mais L'IDE dit:
Affectation non cochée
Map to Map<String,String>
Quelle est la bonne façon de le faire? J'utilise seulement Jackson parce que c'est ce qui est déjà disponible dans le projet, y a-t-il un moyen Java natif de convertir vers/depuis JSON?
En PHP Je voudrais simplement json_decode($str) et je récupérerais un tableau. J'ai besoin essentiellement de la même chose ici.
9 réponses
J'ai le code suivant:
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);
}
C'est la lecture d'un fichier, mais mapper.readValue() acceptera également un InputStream et vous pouvez obtenir un InputStream à partir d'une chaîne en utilisant la suivante:
new ByteArrayInputStream(astring.getBytes("UTF-8"));
Il y a un peu plus d'explication sur le mappeur sur mon blog .
Essayez TypeFactory. Voici le code pour 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);
Voici le code d'une ancienne version de Jackson JSON.
Map<String, String> result = new ObjectMapper().readValue(
data, TypeFactory.mapType(HashMap.class, String.class, String.class));
L'avertissement que vous obtenez est fait par le compilateur, pas par la bibliothèque (ou la méthode utilitaire).
La façon la plus simple d'utiliser Jackson directement serait:
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);
La méthode utilitaire que vous appelez fait probablement quelque chose de similaire à ceci.
ObjectReader reader = new ObjectMapper().readerFor(Map.class);
Map<String, String> map = reader.readValue("{\"foo\":\"val\"}");
Notez que reader instance est Thread Safe.
Conversion de chaîne en carte JSON:
Map<String,String> map = new HashMap<String,String>();
ObjectMapper mapper = new ObjectMapper();
map = mapper.readValue(string, HashMap.class);
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);
Je pense que cela va résoudre votre problème.
Ce qui suit fonctionne pour moi:
Map<String, String> propertyMap = getJsonAsMap(json);
Où getJsonAsMap est défini comme suit:
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);
}
}
Notez que ce échouera Si vous avez des objets enfants dans votre json (parce qu'ils ne sont pas un String, ils sont un autre HashMap), mais fonctionnera si votre json est une liste de valeurs clés de propriétés comme ceci:
{
"client_id": "my super id",
"exp": 1481918304,
"iat": "1450382274",
"url": "http://www.example.com"
}
Utilisation du Gson de Google
Pourquoi ne pas utiliser le Gson de Google comme mentionné dans ici ?
Très simple et a fait le travail pour moi:
HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
Voici la solution générique à ce problème.
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);
}
}
J'espère qu'un jour quelqu'un penserait à créer une méthode util pour convertir en N'importe quel type de carte clé/valeur d'où cette réponse:)