json Feldbezeichner fehlerhaft - Wie kann ich trotzdem damit arbeiten?

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
tadeus
User
Beiträge: 10
Registriert: Donnerstag 8. Oktober 2009, 14:38

Hallo,

ich kann von meiner Heizung ein json auslesen. Leider läuft da irgendwas falsch bei den Feldbezeichnern.

Bei jede Zeile die einen String enthält fehlt beim Feldbezeichner das abschließende Hochkomma. Z.B. "L_statetext:"Heizbetrieb aktiv",
Bei den Zahlenwerten ist alles ok.

Jetzt hab ich hier ein Skript welches beim decodieren meckert:

Code: Alles auswählen

    response = urllib.request.urlopen(json_quelle)
    mydata = response.read()
    decodeddata = mydata.decode ('cp1252')
    d = json.loads(decodeddata)
>> json.decoder.JSONDecodeError: Expecting ':' delimiter: line 15 column 17 (char 257)

Was kann ich da nun tun, um mit dem json trotzdem arbeiten zu können?

Danke


json:

Code: Alles auswählen

{
 "system":{
  "L_ambient":115, 
  "L_errors":0, 
  "L_usb_stick":0, 
  "L_existing_boiler":0
 },
 "hk1":{
  "L_roomtemp_act":0, 
  "L_roomtemp_set":240, 
  "L_flowtemp_act":279, 
  "L_flowtemp_set":290, 
  "L_comfort":0, 
  "L_state":32, 
  "L_statetext:"Heizbetrieb aktiv",
  "L_pump":1, 
  "remote_override":0, 
  "mode_auto":1, 
  "time_prg":0, 
  "temp_setback":180, 
  "temp_heat":240, 
  "temp_vacation":150, 
  "name":"", 
  "oekomode":0
 },
 "pu1":{
  "L_tpo_act":282, 
  "L_tpo_set":550, 
  "L_tpm_act":259, 
  "L_tpm_set":550, 
  "L_pump_release":400, 
  "L_pump":100, 
  "L_state":256, 
  "L_statetext:"Anforderung Ein",
  "mintemp_off":80, 
  "mintemp_on":80, 
  "ext_mintemp_off":80, 
  "ext_mintemp_on":80
 },
 "ww1":{
  "L_temp_set":500, 
  "L_ontemp_act":367, 
  "L_offtemp_act":367, 
  "L_pump":0, 
  "L_state":16912, 
  "L_statetext:"Zeit innerhalb Zeitprogramm|Quellentemp unterhalb Warmwassertemp|Anforderung Ein",
  "time_prg":0, 
  "sensor_on":0, 
  "sensor_off":0, 
  "mode_auto":1, 
  "mode_dhw":1, 
  "heat_once":0, 
  "temp_min_set":200, 
  "temp_max_set":500, 
  "name":"", 
  "smartstart":0, 
  "use_boiler_heat":0, 
  "oekomode":0
 },
 "pe1":{
  "L_temp_act":570, 
  "L_temp_set":700, 
  "L_ext_temp":-32768, 
  "L_frt_temp_act":4661, 
  "L_frt_temp_set":4085, 
  "L_frt_temp_end":7400, 
  "L_br":0, 
  "L_ak":0, 
  "L_not":1, 
  "L_stb":1, 
  "L_modulation":100, 
  "L_runtimeburner":3304, 
  "L_resttimeburner":8000, 
  "L_currentairflow":0, 
  "L_lowpressure":1354, 
  "L_lowpressure_set":1350, 
  "L_fluegas":64, 
  "L_uw_speed":28, 
  "L_state":16, 
  "L_statetext:"Leistungsbrand",
  "L_type":6, 
  "L_starts":1021, 
  "L_runtime":3081, 
  "L_avg_runtime":181, 
  "L_uw_release":550, 
  "L_uw":28, 
  "L_storage_fill":4969, 
  "L_storage_min":400, 
  "L_storage_max":6000, 
  "L_storage_popper":31, 
  "storage_fill_today":32765, 
  "storage_fill_yesterday":32765, 
  "mode":1
 },
   "error":{
   }
}
Benutzeravatar
noisefloor
User
Beiträge: 3858
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du könnest den Rohstring manuell bearbeiten, bevor du ihn an das JSON-Modul übergibst. Wenn du `:"` durch `":"` ersetzen lässt sollte es passen.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Naja nicht immer denn dieser Fehler scheint ja mindestens eine Ausnahme zu besitzen. Und man muss dann natürlich auch sicher sein, dass niemals eine Zeichenkette mit :" endet.

Kann man da nicht den Hersteller drauf aufmerksam machen, dass der da vielleicht ein Firmwareupdate macht und diesen Fehler behebt. Oder wo auch immer diese Daten generiert werden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1022
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Regex darauf loslassen und hoffen, dass die Heizung immer den gleichen Fehler macht.

Code: Alles auswählen

import json
import re

data = """{
 "system":{
  "L_ambient":115, 
  "L_errors":0, 
  "L_usb_stick":0, 
  "L_existing_boiler":0
 },
 "hk1":{
  "L_roomtemp_act":0, 
  "L_roomtemp_set":240, 
  "L_flowtemp_act":279, 
  "L_flowtemp_set":290, 
  "L_comfort":0, 
  "L_state":32, 
  "L_statetext:"Heizbetrieb aktiv",
  "L_pump":1, 
  "remote_override":0, 
  "mode_auto":1, 
  "time_prg":0, 
  "temp_setback":180, 
  "temp_heat":240, 
  "temp_vacation":150, 
  "name":"", 
  "oekomode":0
 },
 "pu1":{
  "L_tpo_act":282, 
  "L_tpo_set":550, 
  "L_tpm_act":259, 
  "L_tpm_set":550, 
  "L_pump_release":400, 
  "L_pump":100, 
  "L_state":256, 
  "L_statetext:"Anforderung Ein",
  "mintemp_off":80, 
  "mintemp_on":80, 
  "ext_mintemp_off":80, 
  "ext_mintemp_on":80
 },
 "ww1":{
  "L_temp_set":500, 
  "L_ontemp_act":367, 
  "L_offtemp_act":367, 
  "L_pump":0, 
  "L_state":16912, 
  "L_statetext:"Zeit innerhalb Zeitprogramm|Quellentemp unterhalb Warmwassertemp|Anforderung Ein",
  "time_prg":0, 
  "sensor_on":0, 
  "sensor_off":0, 
  "mode_auto":1, 
  "mode_dhw":1, 
  "heat_once":0, 
  "temp_min_set":200, 
  "temp_max_set":500, 
  "name":"", 
  "smartstart":0, 
  "use_boiler_heat":0, 
  "oekomode":0
 },
 "pe1":{
  "L_temp_act":570, 
  "L_temp_set":700, 
  "L_ext_temp":-32768, 
  "L_frt_temp_act":4661, 
  "L_frt_temp_set":4085, 
  "L_frt_temp_end":7400, 
  "L_br":0, 
  "L_ak":0, 
  "L_not":1, 
  "L_stb":1, 
  "L_modulation":100, 
  "L_runtimeburner":3304, 
  "L_resttimeburner":8000, 
  "L_currentairflow":0, 
  "L_lowpressure":1354, 
  "L_lowpressure_set":1350, 
  "L_fluegas":64, 
  "L_uw_speed":28, 
  "L_state":16, 
  "L_statetext:"Leistungsbrand",
  "L_type":6, 
  "L_starts":1021, 
  "L_runtime":3081, 
  "L_avg_runtime":181, 
  "L_uw_release":550, 
  "L_uw":28, 
  "L_storage_fill":4969, 
  "L_storage_min":400, 
  "L_storage_max":6000, 
  "L_storage_popper":31, 
  "storage_fill_today":32765, 
  "storage_fill_yesterday":32765, 
  "mode":1
 },
   "error":{
   }
}"""


status_heizung = json.loads(re.sub(r'\w:"', '":"', data))
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
karolus
User
Beiträge: 141
Registriert: Samstag 22. August 2009, 22:34

Code: Alles auswählen

status_heizung = json.loads(re.sub(r'\w:"', '":"', data))

Code: Alles auswählen

status_heizung = json.loads(re.sub(r'(\w):"', r'\1":"', data))
Benutzeravatar
DeaD_EyE
User
Beiträge: 1022
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Stimmt, ohne Klammern müsste der letzte Buchstabe abgeschnitten werden. Schön ist die Lösung jedenfalls nicht und ich würde den Hersteller kontaktieren, damit er mal seine Bugs behebt. Begründung für das Beheben eines Bugs: Weniger Anfragen durch die Kunden
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
tadeus
User
Beiträge: 10
Registriert: Donnerstag 8. Oktober 2009, 14:38

Mit Regex hatte ich bisher noch keinen Kontakt, aber danke schon mal.
Die Daten oben sind von der Ausgabe des jsons über den Browser.

Aber es kommt noch zu einem Fehler.

Und zwar wenn ich das hier ausführe: mydata = response.read()
und mydata ausgebe, bekomme ich folgendes.

Code: Alles auswählen

b'{\n "system":{\n  "L_ambient":126, \n  "L_errors":0, \n  "L_usb_stick":0, \n  "L_existing_boiler":0\n },\n "hk1":{\n  "L_roomtemp_act":0, \n  "L_roomtemp_set":80, \n  "L_flowtemp_act":224, \n  "L_flowtemp_set":80, \n  "L_comfort":0, \n  "L_state":65552, \n  "L_statetext:"Absenkbetrieb aktiv|Au\xdfentemp \xfcber Heizgrenze absenken",\n  "L_pump":0, \n  "remote_override":0, \n  "mode_auto":1, \n  "time_prg":0, \n  "temp_setback":180, \n  "temp_heat":240, \n  "temp_vacation":150, \n  "name":"", \n  "oekomode":0\n },\n "pu1":{\n  "L_tpo_act":476, \n  "L_tpo_set":80, \n  "L_tpm_act":331, \n  "L_tpm_set":80, \n  "L_pump_release":80, \n  "L_pump":0, \n  "L_state":512, \n  "L_statetext:"Anforderung Aus",\n  "mintemp_off":80, \n  "mintemp_on":80, \n  "ext_mintemp_off":80, \n  "ext_mintemp_on":80\n },\n "ww1":{\n  "L_temp_set":150, \n  "L_ontemp_act":518, \n  "L_offtemp_act":518, \n  "L_pump":0, \n  "L_state":8200, \n  "L_statetext:"Zeit au\xdferhalb Zeitprogramm|Anforderung Aus",\n  "time_prg":0, \n  "sensor_on":0, \n  "sensor_off":0, \n  "mode_auto":1, \n  "mode_dhw":1, \n  "heat_once":0, \n  "temp_min_set":200, \n  "temp_max_set":500, \n  "name":"", \n  "smartstart":0, \n  "use_boiler_heat":0, \n  "oekomode":0\n },\n "pe1":{\n  "L_temp_act":381, \n  "L_temp_set":80, \n  "L_ext_temp":-32768, \n  "L_frt_temp_act":374, \n  "L_frt_temp_set":80, \n  "L_frt_temp_end":80, \n  "L_br":0, \n  "L_ak":0, \n  "L_not":1, \n  "L_stb":1, \n  "L_modulation":0, \n  "L_runtimeburner":0, \n  "L_resttimeburner":0, \n  "L_currentairflow":0, \n  "L_lowpressure":497, \n  "L_lowpressure_set":840, \n  "L_fluegas":0, \n  "L_uw_speed":0, \n  "L_state":2147483648, \n  "L_statetext:"Aus",\n  "L_type":6, \n  "L_starts":1024, \n  "L_runtime":3087, \n  "L_avg_runtime":180, \n  "L_uw_release":550, \n  "L_uw":0, \n  "L_storage_fill":4969, \n  "L_storage_min":400, \n  "L_storage_max":6000, \n  "L_storage_popper":31, \n  "storage_fill_today":32765, \n  "storage_fill_yesterday":32765, \n  "mode":1\n },\n   "error":{\n   }\n}\n'
Wenn ich dann euer json.loads(re.sub(r'(\w):"', r'\1":"', mydata)) ausführe bekomme ich folgende Meldung:
Traceback (most recent call last):
File "/home/tadeus/Downloads/oekofen-spy/Python3/oekofen2influx.py", line 116, in <module>
mydata2 = json.loads(re.sub(r'(\w):"', r'\1":"', mydata))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/re/__init__.py", line 185, in sub
return _compile(pattern, flags).sub(repl, string, count)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: cannot use a string pattern on a bytes-like object
Was ist hie ein "bytes-like object"? Der Inhalt ist doch ein String.
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Das b vor der Zeichenkette sagt, dass es Bytes sind.
Was genau denkst du, macht Zeile 3 in deinem allersten Codeblock in diesem Thread?
tadeus
User
Beiträge: 10
Registriert: Donnerstag 8. Oktober 2009, 14:38

Ah okay die macht genau Strings draus, mein Fehler.
Aber genau um diese Zeile geht es ja. Die wirft ja den ursprünglichen Fehler.
Das heißt mit regex kann ich das nicht bearbeiten, da das nur bei Strings geht, ok, aber wenn ichs nicht zu nem String wandeln kann, da er da nen Fehler wirft und ich byte object nicht zu nem String machen kann weil die Funktion wegen dem fehlenden Hochkomma Fehler wirft, was mach ich dann? Da beißt sich doch die Katze in den eigenen Schwanz.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tadeus: Die Zeile 3 löst sicher keinen `JSONDecodeError` aus. Das ist Zeile 4.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten