Variable in JSON String einfügen - Probleme.

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
vel2000
User
Beiträge: 7
Registriert: Dienstag 7. Juli 2015, 04:19

Hallo zusammen, erster Post und gleich ein Problem. (Was auch sonst)
Also:
Ich habe hier einen JSON String, in den eine Variable eingefügt werden soll:
Das hier ist der komplette String, wobei der fett/unterstrichene Teil, die Variable ist.:
http://192.168.1.254:8765/jsonrpc?request={"jsonrpc":"2.0", "id":1, "method": "Player.Open", "params":{"item":{"file":"http://utpdehls01-i.akamaihd.net/hls/live/220551/utpdehls01/Assets_1435171393171/Layer3_master.m3u8?hdnts=st=1436056150~exp=1436061550~acl=*/hls/live/220551/utpdehls01/*~hmac=6a0c67f479d1e048a0448fcc68a07b4003cb0fc58d088f7b265e0baab9ec4e6c"}}}
Also quasi so solls aussehen:
http://192.168.1.254:8765/jsonrpc?request={"jsonrpc":"2.0", "id":1, "method": "Player.Open", "params":{"item":{"file":"my_variable"}}}

Allerdings gelingt es mir nicht, aufgrund der vielen Sonderzeichen die richtige Syntax zu finden.
Kann jemand helfen?
Thanks im voraus
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@vel2000: es geht hier nicht um das Finden einer "Syntax" sondern um das Anwenden der dafür vorgesehenen Module aus der Standardbibliothek:

Code: Alles auswählen

query = urllib.urlencode({'request':json.dumps(data)})
wobei hier sowieso POST-Requests eingesetzt werden sollten und da kann man JSON direkt als MIME-Type angeben.
vel2000
User
Beiträge: 7
Registriert: Dienstag 7. Juli 2015, 04:19

Danke für die Antwort, allerdings sind meine Python Kenntnisse eher "begrenzt"
Ich hatte deinen Vorschlag schon vorher versucht umzusetzen und zwar anhand dieses Beispielthreads:
http://stackoverflow.com/questions/2077 ... -in-python

Es wurde zwar die Variable eingefügt, der Rest des Strings war allerdings vollkommen "zerhackt", ich vermute wegen der Sonderzeichen.
Leider sind die Beispielstrings bei Stackoverflow immer sehr simpel gehalten, bei einem komplexen String, wie meinem sieht das wieder ganz anders aus, leider.
Ein Beispiel, welches in meinem Fall weiter hilft, wäre nett!
Thanks
BlackJack

@vel2000: Gib doch bitte mal Beispieldaten an. Also nicht was Du denkst wie das Ergebnis aussehen sollte sondern welche Daten Du da tatsächlich einsetzen willst. Ich habe ja so ein bisschen den Verdacht das Du entweder ein Problem siehst welches gar nicht existiert weil Du denkst das Ergebnis sähe komisch aus, oder Das Deine Daten nicht "sauber" sind weil Du die von irgendwo kopierst wo sie schon teilweise oder ganz URL-kodiert sind und sie dann fälschlicherweise doppelt kodiert sind.
vel2000
User
Beiträge: 7
Registriert: Dienstag 7. Juli 2015, 04:19

Das Ergebnis (json String) was ich brauche, muss genau so aussehen, incl. aller Sonderzeichen:
Unterstrichener Teil ist die Variable, der andere Teil ist immer gleich. Das hier sind echte Daten, KEINE Beispiele:

Code: Alles auswählen

video_url = json_data['url']  #<-- das ist die Variable, welche in beötigter Form genau so vorliegt --> siehe Zeile 2
http://utpdehls01-i.akamaihd.net/hls/live/220551/utpdehls01/Assets_1435171393171/Layer3_master.m3u8?hdnts=st=1436056150~exp=1436061550~acl=*/hls/live/220551/utpdehls01/*~hmac=6a0c67f479d1e048a0448fcc68a07b4003cb0fc58d088f7b265e0baab9ec4e6c 

Der String ist immer der gleiche, nur soll halt die Variable "video_url", eingefügt werden, mehr nicht :) :
http://192.168.1.254:8765/jsonrpc?reque ... nrpc":"2.0", "id":1, "method": "Player.Open", "params":{"item":{"file":"video_url"}}}
Die Variable hatte ich vor, mit "str.replace" einzufügen, was aber wohl problematisch ist.
vel2000
User
Beiträge: 7
Registriert: Dienstag 7. Juli 2015, 04:19

so, ich hab eine Lösung gefunden, Ersetzung erfolgt über zwei Text Files.
Geht vielleicht einfacher, aber Hauptsache funktioniert (Der Text "video_url" wird durch den Inhalt der Variablen "new_string" ersetzt:

Code: Alles auswählen

replacements = {'video_url':new_string}
with open('json.txt') as infile, open('json2.txt', 'w') as outfile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        outfile.write(line)
url = open("json2.txt")
page = url.read()
print page
json.load(urllib.urlopen(page))
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@vel2000: Du machst jetzt also gar keine Sonderzeichenbehandlung. JSON ist ein Format, das sehr einfach zu verarbeiten ist, also nutze das auch!

Code: Alles auswählen

data = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "Player.Open",
    "params": {
        "item": { "file": video_url }
    }
}
query = urllib.urlencode({'request':json.dumps(data)})
Textersetzungsrummurxen ist keine stabile Lösung.
vel2000
User
Beiträge: 7
Registriert: Dienstag 7. Juli 2015, 04:19

Das ist natürlich sauberer, keine Frage.
Aber wie bekomme ich nun noch diesen Teil:

Code: Alles auswählen

http://192.168.1.254:8765/jsonrpc?
vor dem "request" integriert und das ganze an den Server geschickt?

Edit: Integration ok, nun fehlt nur den "senden" Befehl..
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@vel2000: Du mußt lernen, Probleme so zu zerteilen, dass die Stücke für Dich bekannt und lösbar sind. Das Zusammensetzen von Strings und das Laden einer Web-Seite sind für Dich bekannte Probleme und die Lösung kennst Du auch.
vel2000
User
Beiträge: 7
Registriert: Dienstag 7. Juli 2015, 04:19

Danke für die Belehrung, aber ein paar Zeilen Code wären, für mich als Noob, evtl. hilfreicher gewesen...
Ich wollte aus der ganzen Sache jetzt keine Wissenschaft machen, und auch nicht zum perfekten Python Coder avancieren, sondern schlicht und ergreifend, lediglich einen json string an meinen Server schicken.
Ein Codebeispiel (nicht Schnipsel), wie das zu bewerkstelligen ist, wäre nett gewesen, aber ok.
Ich gehe davon aus, das es für die Cracks vielleicht fünf Minuten Aufwand wäre, für mich ist das allerdings stundenlanges trial and error.
Werde also weiterhin den "Textersetzungsmurks" verwenden.
Trotzdem danke für die Bemühungen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

vel2000 hat geschrieben:Ein Codebeispiel (nicht Schnipsel), wie das zu bewerkstelligen ist, wäre nett gewesen, aber ok.
Wenn dir nicht bekannt ist wie man Strings verkettet dann bist du noch sehr am Anfang. Das Tutorial sagt zum Thema Strings: "Strings can be concatenated (glued together) with the + operator [...]". Vielleicht solltest du dir erst einmal die absoluten Grundlagen von Python aneignen bevor du kompliziertere Dinge tust.

Zu deiner Frage bezüglich des Requests gibt es das passende Package urllib.request in der Standardbibliothek.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@vel2000: was gibt es mehr zu sagen als nehme Zeile 10 deines vorletzten Posts? Das sind alles Dinge, die Du schon kennen solltest, weil Du sie selbst(?) geschrieben hast:

Code: Alles auswählen

page = "http://192.168.1.254:8765/jsonrpc?" + query
print page
json.load(urllib.urlopen(page))
vel2000
User
Beiträge: 7
Registriert: Dienstag 7. Juli 2015, 04:19

das mit der Verkettung (+) hatte ich schon rausgefunden.
Aber dann hatte ich versucht, das ganze mit

Code: Alles auswählen

urllib2.urlopen(page)
an Kodi zu schicken, was aber einen Fehler beim abspielen hervorrief.
Aber jetzt läufts.
Wieder was dazu gelernt.
Antworten