web-dev-qa-db-fra.com

Comment convertir une chaîne JSON en mappage <String, String> 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 le IDE dit:

Affectation décochée Map to Map<String,String>

Quelle est la bonne façon de faire cela? J'utilise uniquement Jackson parce que c'est ce qui est déjà disponible dans le projet. Existe-t-il une manière native Java de convertir en JSON?

Dans PHP, je voudrais simplement json_decode($str) et récupérer un tableau. J'ai essentiellement besoin de la même chose ici.

168
adamJLev

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

Il lit un fichier, mais mapper.readValue() accepte également un InputStream et vous pouvez obtenir un InputStream à partir d'une chaîne en utilisant les éléments suivants:

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

Il y a un peu plus d'explications sur le mappeur sur mon blog .

281
djna

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));
52
Ning Sun

L'avertissement que vous obtenez est fait par compilateur, pas par bibliothèque (ou méthode utilitaire).

Le moyen le plus simple d’utiliser directement Jackson 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.

24
StaxMan
ObjectReader reader = new ObjectMapper().readerFor(Map.class);

Map<String, String> map = reader.readValue("{\"foo\":\"val\"}");

Notez que l'instance reader est Thread Safe.

17
dpetruha

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);
9
Raja
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);

je pense que cela résoudra votre problème.

5
JackieZhi

Ce qui suit fonctionne pour moi:

Map<String, String> propertyMap = getJsonAsMap(json);

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 ceci will échouera si vous avez des objets enfants dans votre json (car ils ne sont pas un String, ils sont un autre HashMap), mais fonctionneront si votre json est une liste de valeurs clés de propriétés telles que:

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

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 d'utilisation pour convertir en n'importe quel type de carte clé/valeur d'où cette réponse :)

Utiliser Gson de Google

Pourquoi ne pas utiliser le Gson de Google comme mentionné dans ici ?

Très simple et fait le travail pour moi:

HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
1
Loukan ElKadi