Wie parst man JSON-ähnliche Strings in eine Map bzw, List<Map>?


#1

Ich bekomme mehrere Strings, die aussehen als wäre sie im JSON-Format, sind es tatsächlich aber nicht. Damit fällt der einfach Weg, einen JSON-Mapper zunutzen leider weg.

Auf das System, dass diese Strings erzeugt habe ich keinen Einfluss. Andere Systeme die mit diesen Dingern arbeiten sind in Python umgesetzt und nutzen einfach eval(string) und haben dadurch ein Dictionary, mit dem sie weiter arbeiten können.

Beispiel 1:
{ 1: 'OBJECT_ID::where-Clause', 2: 'PARAMETER::CHANGED::lorem ipsum::YYYY-MM-DD HH:mm:ss' }

Beispiel 2:
[ { 'FOO': 'BAR', '4711': '0815', 'TEXT': { 'ABC': 'XYZ', '123': 'EINSZWEIDREI' } } ]

Probleme die ich dabei habe:

  • es ist kein JSON (Keys brauchen Anführungszeichen, Anführungszeichen müssen doppelte sein, keine einfachen)
  • Java hat kein eval-Funktion, soweit ich weiß
  • String.split(":") nicht möglich, da Doppelpunkt auch in den Werten vorkommen kann

Wer hat eine Idee oder einen einen Denkanstoß für mich?


#2

Ist der einzige Unterschied zu JSON wirklich nur die einfachen Anführungszeichen? Wie wäre es dann mit:

String fakeJson = "{ 1: 'OBJECT_ID::where-Clause', 2: 'PARAMETER::CHANGED::lorem ipsum::YYYY-MM-DD HH:mm:ss' }";
String realJson = fakeJson.replaceAll("'","\"");
//Dann einfach mit jackson oder ähnlichem verarbeiten

Edit, sorry ich seh gerade dass du auch key ganz ohne Anfürhungszeichen hast. Da hatte ich dich falsch verstanden.


#3

Danke schön, auf die einfacshten Dinge kommt man manchmal nicht.

Hab ein bisschen Angst, dass es dann Probleme gibt mit Anführungszeichen die in einem Value vorkommen könnten, aber ich probiere das einfach mal.


#4

Ähm… dass die Keys 1 und 2 sind, dürfte die Parser auch raushauen, oder? Das sind numbers, und IIRC sind die als Keys nicht zulässig…


#5

aktuell hab ich ein anderes Problem, irgendwo im Text wurden Sonderzeichen und Umlaute ersetzt. Aus “ö” wurde dann “\xf6”.
Jetzt heult der parser erstmal rum dass er das “Escape Zeichen x” nicht kennt.

Langsam macht mich dieses Projekt matschig im Kopf.


#6

evt. hilft das:

https://www.programcreek.com/java-api-examples/?class=org.python.util.PythonInterpreter&method=eval

als alternative Schäff darauf hinweisen das Du erstmal einen Parser schreiben musst - wobei sich das Format anscheinend “jyhton” nennt (nur kurz gelesen bei meinen Links)


#7

danke für den Link, ich werd mir die Beispiele mal genauer anschauen.


#8

so, heute ich hatte Zeit mir die Bibliothek mal ganeuer anzusehen. Die löst viele meiner Probleme. Ich kann mittels Jython die Strings in ein Python Dictionary laden und mir daraus eine Map erzeugen ohne irgendwelche eigenen Versuche das Zeug richtig zu parsen.


#9

Weil ich gerade zufällig drauf gestoßen bin, den Jackson Mapper kann man auch noch ein bisschen konfigurieren. siehe https://fasterxml.github.io/jackson-core/javadoc/2.8/com/fasterxml/jackson/core/JsonParser.Feature.html

Da gibt es zum Beispiel:
*ALLOW_SINGLE_QUOTES
*ALLOW_UNQUOTED_FIELD_NAMES

Hätte mir vielleicht den Kram mit Jython sparen können :smiley: