Sonntag, Juli 5, 2020

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?

InformationsquelleAutor user2869231 | 2016-04-12

3 Kommentare

  1. 2

    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:

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

    Gültiges JSON-würde in etwa so Aussehen

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

    Mit Anführungszeichen ein parser kann sicher ermitteln von Schlüsseln und Werten. Ohne Sie ist ein parser ist verloren.

  2. 1

    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 :

        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

    • Jackson Parsen Ungültiger JSON. Beachten Sie die JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES. Es kann einfach nicht analysieren, nicht börsennotierte Werte eines Feldes (wie es scheint).
    • Ah gut zu wissen danke
    • Auch Ihre theMap wird nicht nur String Werte. Es gibt arrays in JSON. Was Sie vorgeschlagen habe, ist nicht Typ-sicher. Verwenden Sie ein ObjectNode statt.
    • Ja guter Punkt, ich habe die änderung vorgenommen
    • Das ist nicht das, was ich meinte. Nicht alle Werte sind ObjectNode entweder. Ich meinte eher von ObjectNode root = ob.readValue(json, ObjectNode.class);
    • Auch fragte er, wie konvertiert einen Json-String in eine Map
    • Er fragte sich auch, es zu tun mit nicht börsennotierten Werte. Sie korrigiert, dass ein Teil. Korrigieren Sie die Ruhe auch. Es gibt keine Möglichkeit, eine sichere Typ-parametrisierte Map Referenz hier. Sie könnten eine Map<String, ?>> oder Map<String, Object> aber das ist ziemlich nutzlos. ObjectNode gibt Ihnen viel mehr Flexibilität.

  3. 1

    können Sie könnte verwenden Sie den folgenden code Vorverarbeiten der json-string und dann analysieren es.

    String str = ("{requestid:\"55275645.f213506045\",timestamp:\"213506045\",bidnumber:\"55275645\",checkcode:\"1f6ad033de64d1c6357af34d4a38e9e3\",version:\"1.0\",request:{token:ee4e90c2-7a8b-4c73-bd48-1bda7e6734d5,referenceId:0.5878463922999799}}");
        str = (str.replaceAll(":\"?([^{|^]*?)\"?(?=[,|}|\\]])",":\"$1\"").replaceAll("\"?(\\w+)\"?(?=:)","\"$1\""));
        JSONObject obj = JSON.parseObject(str);
        System.out.println(obj.getJSONObject("request").getString("token"));

Kostenlose Online-Tests