Seite 1 von 1

JSON String ... erkenne das Format nicht

Verfasst: Donnerstag 10. Januar 2019, 21:05
von marcusp
Hallo zusammen,

in dem folgenden JSON String erkenne ich nicht, wie genau ich das entschlüsseln sollte.
Den bekomme ich in exakt dieser Form in JSON Dateien angeliefert, muss also damit "arbeiten".

Was mir zum Beispiel Probleme macht ist
a) das Wort "ausgabe_qu" gefolgt von der "(" erst danach beginnt der eigentliche JSON-String, wie ich ihn erkenne
b) mich interessiert nur der mittlere Bereich, welcher zwischen 'ausgabe_qu({"ext":"1","input":"jia","result":' und ',"tag":"","ssid":"ldx801t5yw3e64qavq76n64tb715qe91","version":"test"}' kommt.

Hier der ganze String, den ich bekomme:

Code: Alles auswählen

ausgabe_qu({"ext":"1","input":"jia","result":[{"rank":0,"resrc":"feedback","source":"feedback","form":"ellipse"},{"rank":0,"resrc":"ori","source":"ori","form":"fünfeck"},{"rank":0,"resrc":"ori","source":"ori","form":"dreieck"},{"rank":0,"resrc":"ori","source":"ori","form":"quadrat"},{"rank":0,"resrc":"ori","source":"ori","form":"kreis"}],"tag":"","ssid":"ldx801t5yw3e64qavq76n64tb715qe91","version":"test"}
Meine erste Idee dazu: sollte ich mich mit Regex befassen und die zwei Teile vor und nach dem Part, den ich einfach als JSON behandeln könnte "einfach" löschen?

Oder wie würdet Ihr als erfahrene Coder damit umgehen?

Re: JSON String ... erkenne das Format nicht

Verfasst: Donnerstag 10. Januar 2019, 22:52
von sparrow
Woeher kommen die Daten denn?
Und sehen die tatsächlich so aus? Vorne eine öffnende Klammer und gam Ende nicht?

Ich würde per String-Slicing den Kram wegnenehmen, der nicht JSON ist (wenn der immer fest ist, ist es ja einfach) und danach JSON mit dem entsprechenden Modul parsen.

Re: JSON String ... erkenne das Format nicht

Verfasst: Freitag 11. Januar 2019, 08:18
von Sirius3
@marcusp: woher bekommst Du die Daten? An der Stelle solltest Du ansetzen. Das was Du da hast, ist kein JSON, sondern JSONP eine ziemlich kranke Form von Datenübertragung, also die Browser noch kein AJAX konnten, wird also seit 15 Jahren nicht mehr gebraucht. Jeder Service, der solche Daten liefert, sollte eigentlich auch eine Option haben, ordentliches JSON zu liefern.

Re: JSON String ... erkenne das Format nicht

Verfasst: Freitag 11. Januar 2019, 09:19
von pillmuncher
Sirius3 hat geschrieben: Freitag 11. Januar 2019, 08:18...kein JSON, sondern JSONP...
Ist das nicht besser als JSON? Immerhin hat es ein P mehr...

Re: JSON String ... erkenne das Format nicht

Verfasst: Freitag 11. Januar 2019, 09:51
von marcusp
ahhh doch, schließende Klammer ist in einer zweiten Zeile, daher hatte ich es nicht gesehen.

Bin jetzt soweit, die Parts vorne und hinten, die ich nicht brauche zu ignorieren.
Allerdings verstehe ich nicht, warum er nun beim durchlaufen des Dict, obwohl "form" vorhanden sein muss (ich sehe sie doch) die Ausgabe des Wertes für "form" auf der Strecke bleibt.

Was übersehe ich?

Code: Alles auswählen

input_string = 'ausgabe_qu({"ext":"1","query":"jia","result":[{"rank":0,"resrc":"feedback","source":"feedback","form":"ellipse"},{"rank":0,"resrc":"ori","source":"ori","form":"fünfeck"},{"rank":0,"resrc":"ori","source":"ori","form":"dreieck"},{"rank":0,"resrc":"ori","source":"ori","form":"quadrat"},{"rank":0,"resrc":"ori","source":"ori","form":"kreis"}],"tag":"","ssid":"ldx801t5yw3e64qavq76n64tb715qe91","version":"test"})'

if "form" in input_string:
	print("form is in first input string")
	if"[" in input_string:
		print("eckige öffnende Klammer ist vorhanden")
		marker = -1
		for i in input_string:
			if i == "[":
				marker = 1
			if marker == 1:
				json_string = json_string + i
			if i == "]":
				marker = -1

print(json_string)
if "form" in json_string:
	import json
	parsed_json = json.loads(json_string)
	print("successful step 1")
	zaehler=1
	for key in parsed_json:
		print(key)
		print(zaehler)
		if "word" in (key): 
			print("word vorhanden")
			print (key["word"])
		else: print("word not in key")

Re: JSON String ... erkenne das Format nicht

Verfasst: Freitag 11. Januar 2019, 09:57
von marcusp
schon gesehen ... ich Schussel schaue nach "word" statt nach "form :-)"

Re: JSON String ... erkenne das Format nicht

Verfasst: Freitag 11. Januar 2019, 10:02
von marcusp
hier noch der funktionierende Code, falls jemand den Thread auf seiner Suche findet und die Lösung haben mag (wenn auch sicherlich noch nicht sehr elegant):

Code: Alles auswählen

input_string = 'ausgabe_qu({"ext":"1","query":"jia","result":[{"rank":0,"resrc":"feedback","source":"feedback","form":"ellipse"},{"rank":0,"resrc":"ori","source":"ori","form":"fünfeck"},{"rank":0,"resrc":"ori","source":"ori","form":"dreieck"},{"rank":0,"resrc":"ori","source":"ori","form":"quadrat"},{"rank":0,"resrc":"ori","source":"ori","form":"kreis"}],"tag":"","ssid":"ldx801t5yw3e64qavq76n64tb715qe91","version":"test"})'
json_string = ''

if "form" in input_string:
	if"[" in input_string:
		marker = -1
		for i in input_string:
			if i == "[":
				marker = 1
			if marker == 1:
				json_string = json_string + i
			if i == "]":
				marker = -1

if "form" in json_string:
	import json
	parsed_json = json.loads(json_string)
	for key in parsed_json:
		if "form" in (key): 
			print (key["form"])
Danke Euch allen für die Hilfestellung :-)

Re: JSON String ... erkenne das Format nicht

Verfasst: Freitag 11. Januar 2019, 10:28
von Sirius3
@marcusp: es ist keine gute Idee, JSON nochmal per Hand parsen zu wollen, das kann, muß aber nicht funktionieren. Es ist auf jeden Fall viel zu umständlich und fehlerhaft. JSONP konvertiert man erst in JSON und parst das dann und sucht sich dann den passenden Eintrag:

Code: Alles auswählen

import json
def read_jsonp(jsonp):
    jsonp = jsonp.strip()
    if not jsonp.endswith(')'):
        raise ValueError("no jsonp")
    return json.loads(jsonp.split('(', 1)[1][:-1])

input_string = 'ausgabe_qu({"ext":"1","query":"jia","result":[{"rank":0,"resrc":"feedback","source":"feedback","form":"ellipse"},{"rank":0,"resrc":"ori","source":"ori","form":"fünfeck"},{"rank":0,"resrc":"ori","source":"ori","form":"dreieck"},{"rank":0,"resrc":"ori","source":"ori","form":"quadrat"},{"rank":0,"resrc":"ori","source":"ori","form":"kreis"}],"tag":"","ssid":"ldx801t5yw3e64qavq76n64tb715qe91","version":"test"})'
data = read_jsonp(input_string)
for entry in data['result']:
    print(entry['form'])
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht Tabs. `key` ist bei Dir kein Schlüssel, sondern ein Wörterbuch. Importe gehören an den Anfang der Datei.

Re: JSON String ... erkenne das Format nicht

Verfasst: Freitag 11. Januar 2019, 10:32
von marcusp
@Sirius3 vielen Dank für die Hinweise ... ich freue mich, dass Anfängern so viel Hilfestellung geboten wird, später guten Code zu schreiben :-)