JSON String ... erkenne das Format nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
marcusp
User
Beiträge: 10
Registriert: Donnerstag 10. Januar 2019, 07:37

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?
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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...
In specifications, Murphy's Law supersedes Ohm's.
marcusp
User
Beiträge: 10
Registriert: Donnerstag 10. Januar 2019, 07:37

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")
marcusp
User
Beiträge: 10
Registriert: Donnerstag 10. Januar 2019, 07:37

schon gesehen ... ich Schussel schaue nach "word" statt nach "form :-)"
marcusp
User
Beiträge: 10
Registriert: Donnerstag 10. Januar 2019, 07:37

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 :-)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
marcusp
User
Beiträge: 10
Registriert: Donnerstag 10. Januar 2019, 07:37

@Sirius3 vielen Dank für die Hinweise ... ich freue mich, dass Anfängern so viel Hilfestellung geboten wird, später guten Code zu schreiben :-)
Antworten