Frage

Ich versuche, so etwas zu tun, aber es funktioniert nicht:

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

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

Aber die IDE sagen:

  

Nicht markiert Zuordnung Map to Map<String,String>

Was ist der richtige Weg, dies zu tun? Ich verwende Jackson nur weil das, was bereits in dem Projekt zur Verfügung steht, gibt es einen native Java Weg zu / von JSON zu konvertieren?

In PHP würde ich einfach json_decode($str) und ich würde ein Array zurück. Ich brauche im Grunde die gleiche Sache hier.

War es hilfreich?

Lösung

Ich habe den folgenden Code bekommen:

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

Es ist aus einer Datei zu lesen, aber mapper.readValue() wird auch ein InputStream annehmen und Sie können mithilfe der folgenden eine InputStream aus einer Zeichenfolge erhalten:

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

Es ist ein bisschen mehr Erklärung über den Mapper auf mein Blog .

Andere Tipps

Versuchen TypeFactory. Hier ist der Code für 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);

Hier ist der Code für eine ältere Version von Jackson JSON.

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

Warnung Sie erhalten durch Compiler getan, nicht von Bibliothek (oder Dienstprogramm-Methode).

einfachste Weg Jackson mit direkt wäre:

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

Utility-Methode, die Sie wahrscheinlich rufen Sie tut etwas ähnlich.

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

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

Beachten Sie, dass reader Instanz ist Thread-sicher.

Konvertieren von String zu JSON Karte:

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

Ich denke, das Ihr Problem lösen wird.

Die folgenden Werke für mich:

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

Dabei gilt getJsonAsMap wie so definiert ist:

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

Beachten Sie, dass diese wird fehlschlagen, wenn Sie untergeordnete Objekte in Ihrem json haben (weil sie kein String sind, sind sie ein anderes HashMap), aber funktioniert, wenn Ihr json ist ein Schlüsselwerteliste von Eigenschaften wie folgt:

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

Mit Google Gson

Warum nicht Googles Gson wie in hier erwähnt?

Sehr einfach und hat den Job für mich:

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

Hier ist die allgemeine Lösung für dieses Problem.

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

Hoffnung, ein Tag jemand würde denken, eine util Methode zu konvertieren eine Schlüssel / Wert Art von Karte daher diese Antwort zu erstellen:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top