JSON setzen

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
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Hallo Forum,
ich bin recht neu in der Programmierung mit JSON. Aktuell versuche ich mit JSON und Python zu experimentieren und benötige eure Hilfe. Ich habe Sensoren, die in regelmäßigen Abständen Daten schicken, diese lese ich seriell ein und möchte diese in ein globales JSON-Objekt schreiben:

Code: Alles auswählen

sensoren = {'1':[{'temp':null,'luftfeuchtigkeit':null}],'2':[{'temp':null,'luftfeuchtigkeit':null}],'3':[{'temp':null,'luftfeuchtigkeit':null},{'temp':null,'luftfeuchtigkeit':null}]}
jetzt kommt ein Serieller String rein und wird an folgende Funktion übergeben:

Code: Alles auswählen

def setChannel(message,sensoren):
        print "Channel:" + message[1],
        print "Temperatur:" + message[2],
        print "luftfeuchtigkeit:" + message[3]
        sensoren.items()[message[1]]:
                key['temp']=message[2]
                key['luftfeuchtigkeit']=message[3]
und mit folgender Funktion möchte ich den Spaß gerne auslesen (das Funktioniert auch*G*):

Code: Alles auswählen

def getSensoren(sensoren):
        for (key, value) in sensoren.items():
                print key, value.on


Mein Ziel ist es das JSON Objekt mittels ZeroMQ an ein PHP-Aufruf zu übermitteln, doch dazu muss erst einmal die obige Funktion laufen.
mit bestem Dank
euer Rudel Gurken
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Okay, ich merke selbst schon, dass das nicht ganz der richtige Weg ist, vielleicht sollte ich lieber ein Array nehmen und dass dann irgendwie als json übergeben. Wonach muss ich suchen um ein Key=>Value Array mit Python umzusetzen, sofern das möglich ist? Vielen Dank für eure Geduld mit einem der einfach zu selten mal programmiert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann nennt sich Dictionary. Wenn du das nicht kennst, dann solltest du aber ehrlich gesagt dringend ein Python-Tutorial durchariebten. Python hat auch ein json-Modul, das solltest du dir noch anschauen.
Das Leben ist wie ein Tennisball.
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Hi,
wie gesagt ich arbeite mich gerade in Python ein und bin eher kein Fan dieser Programmiersyntax, obwohl sie recht simpel zu erlernen geht.
Ich danke dir für deinen Hinweis und denke ich habe es richtig gelöst, das JSON Modul konnte ich leider nicht verwenden da ZMQ anscheinend nur Strings übergeben mag.
Ich habe mir den Spaß jetzt so gebastelt:

Code: Alles auswählen

sensoren = {'1':{'temp':'0','luftfeuchtigkeit':'0'},'2':{'temp':'0','luftfeuchtigkeit':'0'},'3':{'temp':'0','luftfeuchtigkeit':'0'},'4':{'temp':'0','luftfeuchtigkeit':'0'}}

def getSensoren():
        sensorInfo = '{'
        for (key,value) in sensoren.items():
                sensorInfo = sensorInfo + '\'' + key + '\':{'
                for (subkey, subvalue) in value.items():
                        sensorInfo = sensorInfo + '\'' + subkey + '\':\'' + subvalue +'\','
                sensorInfo = sensorInfo + '},'
        sensorInfo = sensorInfo + '}'
        sensorInfo = sensorInfo.replace(',}','}')
        print sensorInfo
Das einzige was ich nicht ganz verstehe ist, warum die Ausgabe in anderer Reihenfolge erfolgt:

Code: Alles auswählen

{'1':{'temp':'0','luftfeuchtigkeit':'0'},'3':{'temp':'0','luftfeuchtigkeit':'0'},'2':{'temp':'0','luftfeuchtigkeit':'0'},'4':{'temp':'0','luftfeuchtigkeit':'0'}}

einen schönen Sonntag wünschend eure Gurke
BlackJack

@RudelGurken: Das JSON-Modul solltest Du ganz dringend benutzen, statt das selber noch mal simpel und fehleranfällig nachzuprogrammieren.

Python's `dict`-Typ hat keine feste Reihenfolge.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

RudelGurken hat geschrieben: Ich danke dir für deinen Hinweis und denke ich habe es richtig gelöst, das JSON Modul konnte ich leider nicht verwenden da ZMQ anscheinend nur Strings übergeben mag.
Ja und?

Code: Alles auswählen

import json

d = {"Name": "Hyperion", "KL": 18}

json.dumps(d)
> '{"Name": "Hyperion", "KL": 18}'

isinstance(json.dumps(d), str)
> True
``dumps`` steht übrigens für "dump string" :D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

RudelGurken hat geschrieben:das JSON Modul konnte ich leider nicht verwenden da ZMQ anscheinend nur Strings übergeben mag.
Aber das ist doch gerade der Trick an der Sache: Eine Datenstruktur wird von A nach B übertragen, indem sie als einfacher String dargestellt wird und anschließend von der Gegenseite wieder in richtige Objekte umgewandelt wird. Zum Speichern auf einem Datenträger eignet sich dieses Vorgehen natürlich genau so gut. Dann kann das selbe Programm auch nach einem Neustart noch auf seine alten Daten zugreifen. Demzufolge ist es also völlig klar und auch der vorgesehene Weg, dass nach außen hin nur Strings angenommen bzw versendet werden.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

@ RudelGurken:

Du machst es dir ohne das json-modul nur unnötig schwer.

Code: Alles auswählen

string_out = json.dumps(OBJEKT)
Du kannst Dictionary, List, Tupel, String, Int, Float, Bolean und None an die Methode json.dumps() übergeben. Du bekommst immer einen String zurück.
Sollte irgendwas mit dem Datentyp nicht stimmen, fliegt dir eine Fehlermeldung um die Ohren.
Zuletzt geändert von Hyperion am Montag 5. Mai 2014, 14:02, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

RudelGurken hat geschrieben:Ich danke dir für deinen Hinweis und denke ich habe es richtig gelöst, das JSON Modul konnte ich leider nicht verwenden da ZMQ anscheinend nur Strings übergeben mag.
Vielleicht interessant für Dich: Auf der diesjährigen EuroPython findet ein Talk von Stefan Scherfke, "ZeroMQ – Zero Problems?" statt, in dem laut Beschreibung unter anderen auch der Punkt Communication protocols (and their documentation) behandelt wird.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten