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.

142
demandé sur ROMANIA_engineer 2010-03-26 19:46:42

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 .

246
répondu djna 2016-08-08 10:00:55

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));
45
répondu Ning Sun 2017-03-03 00:29:57

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.

20
répondu StaxMan 2010-03-27 06:17:09
ObjectReader reader = new ObjectMapper().readerFor(Map.class);

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

Notez que reader instance est Thread Safe.

17
répondu dpetruha 2017-07-12 05:00:28

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
répondu Raja 2012-06-28 17:26:25
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.

5
répondu JackieZhi 2015-12-10 06:10:59

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 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"
}
3
répondu Brad Parks 2015-12-22 13:57:41

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());
3
répondu Loukan ElKadi 2017-12-20 07:30:53

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

1
répondu NameNotFoundException 2018-05-04 11:09:17