2016-11-08 4 views
0

Entschuldigung für das Duplizieren der Frage, aber mein Problem ist andere. Ich habe JSON-Parser-Methode, wo ich von JSON-String zu Karte analysieren. Aber Json-String hat einen Wert, der auch Json-String ist. So etwas Ähnliches:Wie konvertiert man JSON String in Map

{ 
    "status_code":"255", 
    "data":"{\"user\":{\"idpolzovatel\":1,\"id_poluch_tip\":1,\"fio_polzovatel\":\"Andrew Artificial\",\"login\":\"imi\",\"parol\":\"698d51a19d8a121ce581499d7b701668\",\"key\":null,\"nachalnik\":1,\"buhgalter\":0,\"delopr\":1},\"token\":\"230047517dd122c8f8116a6fa591a704\"}", 
    "message":"Successfull!" 
} 

Also, meine Parse-Methode:

public Map<String, String> convertToMapFromJSON(String res){ 
    ObjectMapper objectMapper = new ObjectMapper(); 
    Map<String, String> response = new HashMap<String, String>(); 
    try { 
     response = objectMapper.readValue(res, new TypeReference<Map<String, String>>); 
     int t = 0; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return response; 
} 

ich Antwort auf Client:

ResponseEntity<String> responseEntity = restTemplate.postForEntity(REST_SERVICE_URI + "/auth/", data, String.class); 

bekommen Körper

String res = responseEntity.getBody();//получаем тело запроса в формате JSON 

dann diejenigen verwenden Methode:

Map<String, String> response = convertToMapFromJSON(res); 

Map<String, String> data1 = convertToMapFromJSON(response.get("data")); 

Map<String, String> userDetailes = convertToMapFromJSON(data1.get("user")); 

aber, als ich das letzte Methode data1.get("user"); I Ausnahme erhalten:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.lang.String 

ok, bekam es. Also, data1.get("user") ist keine Zeichenfolge, es ist LinkedHashMap. So könnte ich das dann tun:

Map<String, String> userDetailes = data1.get("user"); 

? Aber dann bekomme ich den Fehler, wo IDE mir sagt, dass data1.get("user") eine Zeichenfolge ist.

Screenshots von Debugger: enter image description here

Also, wie kann ich diese LinkedHashMap mit meinen Userdaten erhalten? Entschuldigung für mein Englisch. Vielen Dank.

+0

Mögliche Duplikat [Erstellung HashMap aus einem JSON String] (http://stackoverflow.com/questions/22011200/creating-hashmap-from-a- json-string) – DimaSan

+0

manchmal haben SDE Probleme; versuche, das Projekt zu säubern und neu aufzubauen ... und versuche, von der Befehlszeile (maven oder javac) zu bauen, damit du nicht vom IDE-Compiler abhängig bist – OhadR

+0

Aktualisiere deine Frage mit echter JSON-Nutzlast und benutzter Bibliothek (Jackson?) – LoganMzz

Antwort

0

Java-Anwendung Typ löschen für Generika. Es überprüft die Korrektheit des Typs zur Kompilierzeit und entfernt dann die generische Signatur im Kompilierungscode (ByteCode). Daher gibt es keine Überprüfung zur Laufzeit.

dieses Beispiel Sie, welche gleiche Verhalten wie Ihre JSON Bibliothek:

/** Returns a generic map which all keys are string but not values **/ 
T <T extends Map> raw(Class<T> clazz) { 
    Map object = new LinkedHashMap(); 
    object.put("string", "This is a String"); 
    object.put("map" , new LinkedHashMap()); 
    return (T) object; 
} 

Hier ist der Code:

/** codes you try to execute/write **/ 
void withStringValues() { 
    Map<String,String> object = raw(Map<String,String>.class); 
    String string = object.get("string"); // Ok 
    String map = object.get("map"); // ClassCastException 
    Map map = object.get("map"); // Doesn't compile 
} 

Wie Sie den Anruf raw wird als gültig betrachtet als kompilierte Code don sehen nicht nach Generika suchen. Aber es macht eine ungültige und implizite Umwandlung von Map zu Map<String,String>, die im kompilierten Code tatsächlich nicht vorkommt.

Generics sind entfernen und die kompilierte Version:

void withTypeErasure() { 
    Map object = raw(Map.class); 
    String string = (String) object.get("string"); 
    String map = (String) object.get("map"); 
} 

Wie Sie sehen können, hat Java-Compiler alle generischen entfernt und fügt notwendigen Würfe. Sie können sehen, was hier falsch läuft.

Ihr Code muss wie folgt aussehen:

void withRealValues() { 
    Map<String,Object> object = raw(Map<String,Object>.class); 
    String    string = (String) object.get("string"); // Ok 
    Map<String,Object> map = (Map) object.get("map");  // Ok 
} 
+0

Änderungsmethode. Fügen Sie die TypeReference-Klasse hinzu. – Artificial

+0

Das Hinzufügen von TypeReference ändert nichts aufgrund eines generischen Typs. Die gültige generische Signatur ist 'Map ' oder ohne Generic nur 'Map' – LoganMzz

+0

Vielen Dank für Ihre Hilfe. – Artificial

0

Sieht so aus, als ob ObjectMapper die Zeichenfolge im JSON-Format entschlüsselt und für Sie analysiert hat. Sie könnten einfach eine neue Methode zum Parsen (data1.get ("user")) hinzufügen, die eine Map zurückgibt.

Verwandte Themen