2016-04-12 19 views
7

Ho una stringa in formato Json, solo nessuna delle chiavi o dei valori è circondata da virgolette. Per esempio, io ho questo:Converti stringa json senza virgolette in una mappa

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

voglio che questo diventi una mappa che assomiglia così:

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

ho provato i seguenti due metodi:

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

Questa volontà genera un errore, dicendo:

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

Poi ho provato a cambiare la configurazione di mapping:

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

Ma questo ha gettato un errore che dice:

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] 

C'è un modo di ottenere questo Map quando le citazioni non sono inclusi nella stringa JSON?

+1

La stringa JSON non è valida, testarla qui: http://jsonlint.com –

+0

in che modo? e apparentemente questo commento ha bisogno di 15 caratteri per aggiungerlo – user2869231

+0

o meglio, come lo renderei valido? Chiaramente il problema è nel non avere le virgolette. Dovrei fare qualche spaccatura brutta? – user2869231

risposta

0

L'ObjectMapper non sarà in grado di analizzare l'input Json se non è valido, quindi la risposta è no.

alla prova la vostra JSON qui: http://jsonlint.com/

Dopo aver corretto l'ingresso JSON si poteva fare:

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

stamperà:

Bob

+1

Jackson può analizzare JSON non valido. Nota 'JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES'. Non è in grado di analizzare i valori dei campi non quotati (sembra). – Savior

+0

Ah, buono a sapersi, grazie –

+0

Inoltre, 'theMap' non avrà solo valori' String'. Ci sono matrici in quel JSON. Quello che hai proposto non è sicuro. Usa invece un 'ObjectNode'. – Savior

1

Per rispondere alla tua domanda : Non esiste il numero s afe modo di ottenere il tuo JSON - che comunque non è JSON, perché non è valido - convertito in Map<String, Object>.

Vorrei esporre solo un po '(perché non può essere analizzato in modo sicuro?): Immaginate un "JSON" come questo:

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

valido JSON sarebbe simile a questa

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

Con le virgolette un parser può determinare in modo sicuro chiavi e valori. Senza di loro si perde un parser.