2016-04-12 7 views
7

Ich habe eine Zeichenfolge, die im JSON-Format ist, nur keine der Tasten oder Werte, die von Anführungszeichen umgeben ist. Zum Beispiel habe ich dies:konvertiert JSON-String ohne Anführungszeichen in eine Karte

String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}" 

Ich möchte dieses eine Karte werden, wie so aussieht:

Map<String, Object> friend1Map = new HashMap<>(); 
friend1Map.put("name", "Dan"); 
friend1Map.put("age", 23); 

Map<String, Object> friend2Map = new Hashmap<>(); 
friend2Map.put("name", "Zane"); 
friend2Map.put("age", 24); 

Map<String, Object> newMap = new HashMap<>(); 
newMap.put("name", "Bob"); 
newMap.put("state", "Colorado"); 
newMap.put("Friends", Arrays.asList(friend1Map, friend2Map)); 

Ich habe versucht, die folgenden zwei Methoden:

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); 

Dieser Wille einen Fehler werfen und sagen:

Unexpected character ('n'): was expecting double-quote to start field name 

Dann habe ich versucht, die Config von Mapper Wechsel:

mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); 

Aber das warf einen Fehler zu sagen:

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Bob': was expecting ('true', 'false' or 'null') 
at [Source: {name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}; line: 1, column: 11] 

Gibt es eine Möglichkeit, diese Karte zu bekommen, wenn Zitate sind nicht im JSON-String enthalten?

+1

Ihr JSON-String ungültig ist, testen Sie es hier: http://jsonlint.com –

+0

wie so? und anscheinend braucht dieser Kommentar 15 Zeichen, um ihn hinzuzufügen – user2869231

+0

oder besser, wie würde ich es gültig machen? Es ist klar, dass das Problem darin besteht, die Zitate nicht zu haben. Müsste ich einige böse Splits machen? – user2869231

Antwort

0

Die ObjectMapper werden zu analysieren Lage sein, die Json Eingabe nicht, wenn es nicht gültig ist, so ist die Antwort nein.

Testen Sie Ihre Json hier: http://jsonlint.com/

Nach der Json Eingabe korrigieren könnten Sie tun:

ObjectMapper ob = new ObjectMapper(); 
    ob.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
    String json = "{name: \"Bob\", state: \"Colorado\", Friends: [{ name: \"Dan\", age: 23 }, {name: \"Zane\", age: 24 }]}"; 

    Map<String, ObjectNode> theMap = ob.readValue(json, Map.class); 
    System.out.println(theMap.get("name")); 

drucken:

Bob

+1

Jackson kann ungültiges JSON analysieren. Beachten Sie die 'JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES'. Es kann einfach nicht abgekürzte Feldwerte nicht parsen (es scheint). – Savior

+0

Ah gut zu wissen danke –

+0

Auch Ihre 'theMap' wird nicht nur' String' Werte haben. In diesem JSON gibt es Arrays. Was Sie vorgeschlagen haben, ist nicht typsicher. Verwenden Sie stattdessen einen 'ObjectNode'. – Savior

1

Um Ihre Frage zu beantworten : Es gibt keine s Afe Weg, Ihre JSON - die nicht JSON ist übrigens, weil es ungültig ist - in eine Map<String, Object> umgewandelt.

Lassen Sie mich erarbeiten gerade ein wenig (warum kann es nicht sicher analysiert werden?): eine "JSON" Stellen Sie sich vor wie folgt aus:

{ 
    this is my key: and here's my value and it even has a colon: 
} 

Valid JSON so etwas wie dieses

{ 
    "this is my key": "and here's my value and it even has a colon:" 
} 
aussehen würde

Mit den Anführungszeichen kann ein Parser Schlüssel und Werte sicher bestimmen. Ohne sie ist ein Parser verloren.

Verwandte Themen