Question

Je suis en train de faire quelque chose comme ça, mais ça ne fonctionne pas:

Map<String, String> propertyMap = new HashMap<String, String>();

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

Mais l'IDE dit:

  

Affectation Décoché Map to Map<String,String>

Quelle est la bonne façon de le faire? Je suis seulement en utilisant Jackson parce que ce qui est déjà disponible dans le projet, est-il un moyen Java natif de conversion vers / à partir JSON?

En PHP Je voudrais simplement json_decode($str) et je retourner un tableau. J'ai besoin fondamentalement la même chose ici.

Était-ce utile?

La solution

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 est la lecture d'un fichier, mais mapper.readValue() également accepter un InputStream et vous pouvez obtenir une InputStream 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 cartographe sur mon blog .

Autres conseils

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 pour une ancienne version de Jackson JSON.

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

Avertissement vous est fait par le compilateur, et non par la bibliothèque (ou méthode utilitaire).

en utilisant Jackson manière la plus simple serait directement être:

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

Méthode utilitaire vous appelez probablement fait juste quelque chose de semblable à cela.

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

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

Notez que l'instance de reader est thread-safe.

Conversion de chaîne à JSON Carte:

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.

Les oeuvres suivantes pour moi:

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

getJsonAsMap est défini comme ceci:

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 échouer si vous avez des objets enfants dans votre JSON (parce qu'ils ne sont pas un String, ils sont une autre HashMap), mais ne fonctionnera que si votre JSON est une liste de valeurs clé des propriétés comme ceci:

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

Utilisation Gson Google

Pourquoi ne pas utiliser Google Gson comme mentionné dans ?

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

L'espoir qu'un jour quelqu'un pourrait penser à créer une méthode util pour convertir à tout type clé / valeur de carte donc cette réponse:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top