NEWS
JSON Format aus SimpleAPI Adapter
-
Hallo Freunde,
ich speichere einen JSON String im Datenpunkt der richtig geschrieben wird:
{ "data": [ { "temperaturaussen": 9, "feuchtaussen": 87.54, "temperaturwohnzimmer": 21, "feuchtwohnzimmer": 56.98, "temperaturbadezimmer": 21, "feuchtbadezimmer": 60.79, "davefeucht": 58, "daveduenger": 1345, "udofeucht": 50, "udoduenger": 294 } ] }
Über getPlainValue im Simple Adapter bekomme ich jedoch folgenden Output:
"{\"data\":[{\"temperaturaussen\":9,\"feuchtaussen\":87.54,\"temperaturwohnzimmer\":21,\"feuchtwohnzimmer\":56.98,\"temperaturbadezimmer\":21,\"feuchtbadezimmer\":60.79,\"davefeucht\":58,\"daveduenger\":1345,\"udofeucht\":50,\"udoduenger\":294}]}"
Kann mir jemand erklären wo die \ herkommen ?
Ich schreibe den Datenpunkt über folgendes Script
setState("javascript.0.EigeneDatenpunkte.Daten", { data: [{ temperaturaussen: getState("javascript.0.EigeneDatenpunkte.TemperaturBalkon").val, feuchtaussen: getState("deconz.0.Sensors.10.humidity").val, temperaturwohnzimmer: getState("javascript.0.EigeneDatenpunkte.TemperaturWohnzimmer").val, feuchtwohnzimmer: getState("deconz.0.Sensors.13.humidity").val, temperaturbadezimmer: getState("javascript.0.EigeneDatenpunkte.TemperaturBadezimmer").val, feuchtbadezimmer: getState("deconz.0.Sensors.16.humidity").val, davefeucht: getState("ble.0.c4:7c:8d:6d:c3:63.moisture").val, daveduenger: getState("ble.0.c4:7c:8d:6d:c3:63.fertility").val, udofeucht: getState("ble.0.c4:7c:8d:6d:c3:7d.moisture").val, udoduenger: getState("ble.0.c4:7c:8d:6d:c3:7d.fertility").val }] });
Grüße und Danke
-
@bobby sagte in JSON Format aus SimpleAPI Adapter:
Kann mir jemand erklären wo die \ herkommen ?
Das JSON wird in einen String umgewandelt. Damit das wieder ein JSON wird musst du den String mit JSON.parse(string) umwandeln.
-
@jey-cee Ich möchte die Werte gerne in Android Studio benutzen.
Wenn ich
val dataJson = JSONObject(jsonstring)
versuche bekomme ich folgende Fehlermeldung
org.json.JSONException: Value {"data":[{"temperaturaussen":14,"feuchtaussen":76.75,"temperaturwohnzimmer":21,"feuchtwohnzimmer":56.65,"temperaturbadezimmer":21,"feuchtbadezimmer":60.02,"davefeucht":58,"daveduenger":1345,"udofeucht":50,"udoduenger":294}]} of type java.lang.String cannot be converted to JSONObject
-
@bobby sagte: Ich schreibe den Datenpunkt über folgendes Script
Damit wird ein Objekt in den Datenpunkt geschrieben. Für ein JSON braucht es JSON.stringify(obj).
setState("javascript.0.EigeneDatenpunkte.Daten", JSON.stringify( { data: [{ temperaturaussen: getState("javascript.0.EigeneDatenpunkte.TemperaturBalkon").val, feuchtaussen: getState("deconz.0.Sensors.10.humidity").val, temperaturwohnzimmer: getState("javascript.0.EigeneDatenpunkte.TemperaturWohnzimmer").val, feuchtwohnzimmer: getState("deconz.0.Sensors.13.humidity").val, temperaturbadezimmer: getState("javascript.0.EigeneDatenpunkte.TemperaturBadezimmer").val, feuchtbadezimmer: getState("deconz.0.Sensors.16.humidity").val, davefeucht: getState("ble.0.c4:7c:8d:6d:c3:63.moisture").val, daveduenger: getState("ble.0.c4:7c:8d:6d:c3:63.fertility").val, udofeucht: getState("ble.0.c4:7c:8d:6d:c3:7d.moisture").val, udoduenger: getState("ble.0.c4:7c:8d:6d:c3:7d.fertility").val }] } ));
-
Ich bekomme ja den richtigen String ausgelesen.
V/JSON: "{\"temperaturaussen\":13,\"feuchtaussen\":77.18,\"temperaturwohnzimmer\":21,\"feuchtwohnzimmer\":57.5,\"temperaturbadezimmer\":21,\"feuchtbadezimmer\":63.18,\"davefeucht\":58,\"daveduenger\":1345,\"udofeucht\":50,\"udoduenger\":294}"
Nur wenn ich ihn verarbeiten will bekomme ich eine Fehlermeldung:
Log.v("JSON",fullJson); val dataJson = JSONObject(fullJson)
of type java.lang.String cannot be converted to JSONObject
-
@bobby sagte in JSON Format aus SimpleAPI Adapter:
JSONObject
kannst du den string nicht vorher bearbeiten und alle schrägstriche entfernen - bin sicher java kann das
bevor du JSONObject(fullJson)
ausführstirgendwie so: str.replaceAll("\", "")); oder str.replaceAll("\\", ""))
-
@bobby sagte in JSON Format aus SimpleAPI Adapter:
@jey-cee Ich möchte die Werte gerne in Android Studio benutzen.
Wenn ich
val dataJson = JSONObject(jsonstring)
versuche bekomme ich folgende Fehlermeldung
org.json.JSONException: Value {"data":[{"temperaturaussen":14,"feuchtaussen":76.75,"temperaturwohnzimmer":21,"feuchtwohnzimmer":56.65,"temperaturbadezimmer":21,"feuchtbadezimmer":60.02,"davefeucht":58,"daveduenger":1345,"udofeucht":50,"udoduenger":294}]} of type java.lang.String cannot be converted to JSONObject
Diesem Artikel nach müsste der richtige Befehl wie folgt lauten
JSONObject dataJson = new JSONObject(jsonstring);
https://stackoverflow.com/questions/18192891/conversion-from-string-to-json-object-android
-
@oliverio Ich bin dabei meine eigene Smart Home App zu schreiben, dafür benutze ich Kotlin.
Da gibt es leider
JSONObject dataJson = new JSONObject(jsonstring);
nicht, nur
val dataJson = JSONObject(jsonstring)
-
Wenn ich den Datenpunkt als String speichere, z.B. so
setState("javascript.0.EigeneDatenpunkte.Wandtablet_Daten", "data: [{tempaussen: 42, tempwohnzimmer: 39}]")
Und dann ein Json Objekt erstelle
val dataJson = JSONObject("{" + fullJson.substring(1, fullJson.length -1) + "}")
indem ich Klammern wieder einfüge funktioniert es zwar, aber das scheint mir irgendwie nicht des Rätsels Lösung zu sein.
Wirkt auch einfach zu umständlich. -
@bobby Im Prinzip ist der output doch in Ordnung - die Anführungszeichen werden maskiert.
Ich hab es mal mit Deinem String versucht - keine Probleme:
let obj2 = JSON.parse("{\"data\":[{\"temperaturaussen\":9,\"feuchtaussen\":87.54,\"temperaturwohnzimmer\":21,\"feuchtwohnzimmer\":56.98,\"temperaturbadezimmer\":21,\"feuchtbadezimmer\":60.79,\"davefeucht\":58,\"daveduenger\":1345,\"udofeucht\":50,\"udoduenger\":294}]}"); log (obj2); log (obj2.data[0].temperaturwohnzimmer);
Im Prinzip ist deshalb eigentlich der Antwort von @Jey-Cee nichts hinzuzufügen und man muss auch überhaupt keine Verrenkungen mit Stringmanipulationen machen.
Also:
val dataJson = JSON.parse(jsonstring)
Wenn Du das ganze wieder stringifizierst - dann ist die Maskierung auch wieder weg:
Ist in meinen Augen unnötig, aber damit würde quasi Deine Zuweisung wie folgt aussehen:
val dataJson = JSONObject(JSON.stringify(JSON.parse(jsonstring)))