2016-04-12 12 views
7

Mam ciąg znaków w formacie Json, tylko żaden z kluczy ani wartości nie jest otoczony cudzysłowami. Na przykład, mam to:Konwertuj ciąg jsonów bez cudzysłowów na mapę

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

chcę tego, aby stać się mapa, która wygląda tak:

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

Próbowałem dwóch następujących metod:

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

Będzie zgłoś błąd, mówiąc:

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

Potem próbowałem zmieniając config z odwzorowującym:

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

Ale to wyrzucił błąd mówiąc:

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] 

Czy istnieje sposób uzyskiwania to Mapa gdy notowania nie są wliczone w ciąg json?

+1

Twój ciąg Json jest nieprawidłowy, przetestuj go tutaj: http://jsonlint.com –

+0

jak to zrobić? i najwyraźniej ten komentarz potrzebuje 15 znaków, aby go dodać: – user2869231

+0

, a raczej, w jaki sposób powinienem go uzasadnić? Najwyraźniej problemem jest brak notowań. Czy musiałbym zrobić kilka nieprzyjemnych podziałów? – user2869231

Odpowiedz

0

Program ObjectMapper nie będzie w stanie przeanalizować danych wejściowych Json, jeśli nie jest prawidłowy, więc odpowiedź brzmi "nie".

Przetestuj Json tutaj: http://jsonlint.com/

Po skorygowaniu wejście JSON można zrobić:

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

wypisze:

Bob

+1

Jackson może parsować nieprawidłowy JSON. Zwróć uwagę na 'JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES'. Po prostu nie może parsować niecytowanych wartości pól (wydaje się). – Savior

+0

Ah dobrze wiedzieć dzięki –

+0

Również twój 'theMap' nie będzie miał tylko wartości' String'. W tym JSON są tablice. To, co zaproponowałeś, nie jest bezpieczne. Zamiast tego należy użyć 'ObjectNode'. – Savior

1

Aby odpowiedzieć na to pytanie : Nie ma s afe sposób na uzyskanie JSON-który nie jest JSON przy okazji, ponieważ jest nieważny - przekonwertowany na Map<String, Object>.

Pozwól rozwinąć tylko trochę (dlaczego nie może być analizowany bezpiecznie?): Wyobraźmy sobie „JSON” tak:

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

Ważny JSON będzie wyglądać następująco

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

Za pomocą cudzysłowu parser może bezpiecznie określić klucze i wartości. Bez nich parser jest tracony.