Seite 1 von 1

JSON setzen

Verfasst: Samstag 3. Mai 2014, 14:30
von RudelGurken
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

Re: JSON setzen

Verfasst: Samstag 3. Mai 2014, 16:21
von RudelGurken
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.

Re: JSON setzen

Verfasst: Samstag 3. Mai 2014, 16:39
von EyDu
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.

Re: JSON setzen

Verfasst: Sonntag 4. Mai 2014, 16:39
von RudelGurken
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

Re: JSON setzen

Verfasst: Sonntag 4. Mai 2014, 17:03
von 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.

Re: JSON setzen

Verfasst: Sonntag 4. Mai 2014, 17:49
von Hyperion
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

Re: JSON setzen

Verfasst: Sonntag 4. Mai 2014, 18:51
von snafu
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.

Re: JSON setzen

Verfasst: Montag 5. Mai 2014, 12:53
von DeaD_EyE
@ 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.

Re: JSON setzen

Verfasst: Mittwoch 7. Mai 2014, 18:33
von mutetella
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