Konvertieren von json-string ohne Anführungszeichen, in eine Karte
Ich habe einen string im Json-format, nur keine Schlüssel oder Werte, werden diese von Anführungsstrichen umgeben sind. Ich habe zum Beispiel diese:
String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}"
Möchte ich diese zu einer Karte, die sieht so aus:
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 wirft einen Fehler, nämlich:
Unexpected character ('n'): was expecting double-quote to start field name
Dann habe ich versucht, die änderung der config-mapper:
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
Aber das warf eine Fehlermeldung angezeigt:
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, wenn Zitate nicht enthalten sind in den json-string?
- Ihre Json-String ungültig ist, testen Sie es hier : jsonlint.com
- wie so? und anscheinend ist dieser Kommentar muss 15 Zeichen, um es hinzuzufügen
- oder vielmehr, wie würde ich es machen gültig? Klar, das Problem ist nicht die Anführungszeichen. Würde ich tun einige böse teilt?
- Nur um klar zu sein: das ist kein Json, nur Json-like. Ich glaube nicht, dass jackson verarbeiten kann unquoted String-Werte, nur nicht quotierten Schlüssel werden unterstützt. Diese Antwort könnte dir helfen: stackoverflow.com/a/34794445/5108418
- Vielleicht schauen Sie in der GSON-Bibliothek lieber als Jackson. Siehe stackoverflow.com/questions/20557131/gson-parse-unquoted-value
- dang. Gut, nach der Inspektion, wird der String durch ein mapper.writeValueAsString(Karte). Die Karte ist im wesentlichen die, die ich bin mit dem Ziel zu erhalten. Also, dieses problem zu umgehen, ich sollte in der Lage sein zu ersetzen, die writeValueAsString mit etwas, das die Flucht der Zitate im inneren der Karte schreiben, wenn es als string. Gibt es eine Möglichkeit, das zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine Frage zu beantworten: Es gibt keine sicher Weg, um Ihre JSON - das ist nicht JSON-durch die Art und Weise, weil es ungültig ist - die Umwandlung in eine
Map<String, Object>
.Ich möchte nur ein wenig (warum kann Sie nicht analysiert werden, sicher?):
Stellen Sie sich eine "JSON" wie folgt:
Gültiges JSON-würde in etwa so Aussehen
Mit Anführungszeichen ein parser kann sicher ermitteln von Schlüsseln und Werten. Ohne Sie ist ein parser ist verloren.
Dem ObjectMapper nicht in der Lage sein, um eine Analyse der Json-input, wenn es nicht gültig ist, so ist die Antwort Nein.
Testen Sie Ihre Json-hier : http://jsonlint.com/
Nach der Korrektur der Json-input, den Sie tun könnten :
Drucken :
JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES
. Es kann einfach nicht analysieren, nicht börsennotierte Werte eines Feldes (wie es scheint).theMap
wird nicht nurString
Werte. Es gibt arrays in JSON. Was Sie vorgeschlagen habe, ist nicht Typ-sicher. Verwenden Sie einObjectNode
statt.ObjectNode
entweder. Ich meinte eher vonObjectNode root = ob.readValue(json, ObjectNode.class);
Map
Referenz hier. Sie könnten eineMap<String, ?>>
oderMap<String, Object>
aber das ist ziemlich nutzlos.ObjectNode
gibt Ihnen viel mehr Flexibilität.können Sie könnte verwenden Sie den folgenden code Vorverarbeiten der json-string und dann analysieren es.