/ / Konvertieren eines JSON-Strings in eine Map <String, String> mit Jackson JSON - Java, Jackson

Wie konvertiert man einen JSON-String in eine Map <String, String> mit Jackson JSON - Java, Jackson

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

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

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

Aber die IDE sagt:

Ungeprüfte Zuordnung Map to Map<String,String>

Was ist der richtige Weg, um dies zu tun? Ich benutze nur Jackson, weil dies bereits im Projekt verfügbar ist. Gibt es eine native Java-Methode für die Konvertierung nach / von JSON?

In PHP würde ich einfach json_decode($str) und ich würde eine Reihe zurückbekommen. Ich brauche im Grunde das gleiche hier.

Antworten:

239 für Antwort № 1

Ich habe folgenden Code erhalten:

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 liest aus einer Datei, aber mapper.readValue() wird auch ein akzeptieren InputStream und Sie können eine erhalten InputStream aus einer Zeichenfolge mithilfe der folgenden:

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

Es gibt ein bisschen mehr Erklärungen zum Mapper mein Blog.


44 für die Antwort № 2

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

19 für die Antwort № 3

Die Warnung, die Sie erhalten, wird vom Compiler ausgeführt, nicht von der Bibliothek (oder Dienstprogrammmethode).

Der einfachste Weg, Jackson direkt zu nutzen, 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);

Die von Ihnen aufgerufene Utility-Methode führt wahrscheinlich nur etwas Ähnliches aus.


17 für die Antwort № 4
ObjectReader reader = new ObjectMapper().readerFor(Map.class);

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

Beachten Sie, dass reader Instanz ist Thread-sicher.


9 für die Antwort № 5

Konvertieren von String zu JSON Map:

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

ObjectMapper mapper = new ObjectMapper();

map = mapper.readValue(string, HashMap.class);

5 für die Antwort № 6
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);

Ich denke, das wird dein Problem lösen.


3 für die Antwort № 7

Folgendes funktioniert für mich:

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

woher getJsonAsMap ist wie folgt definiert:

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 dies werden schlagen fehl, wenn Sie untergeordnete Objekte in Ihrem JSON haben (weil sie kein JSON sind) StringSie sind ein anderer HashMap), funktioniert aber, wenn Ihr json eine Liste mit Schlüsselwerten von Eigenschaften ist, wie z.

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

3 für die Antwort № 8

Verwendung von Google "s Gson

Warum verwenden Sie nicht Googles Gson wie in Hier?

Sehr unkompliziert und hat die Arbeit für mich erledigt:

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

0 für die Antwort № 9

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

Hoffe, irgendwann würde jemand darüber nachdenken, eine util-Methode zu erstellen, um sie in einen beliebigen Key / Value-Map-Typ umzuwandeln, daher diese Antwort :)


0 für die Antwort № 10

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

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

Hoffe, irgendwann würde jemand darüber nachdenken, eine util-Methode zu erstellen, um sie in einen beliebigen Key / Value-Map-Typ umzuwandeln, daher diese Antwort :)