NEWS
Probleme beim parsen von Arrays mit json2iob
-
Hi,
ich bin gerade etwas verzweifelt beim parsen von json arrays. In den Arrays stehen zu allem Überfluss auch noch IP Adressen.
Es wird versucht die Inhalte vom Array als objectname anzulegen. Durch die Dots kommt dann natürlich nur Mist heraus.
await this.json2iob.parse('test' + id, item, { forceIndex: true, zeroBasedArrayIndex : true });
Erwartet hätte ich es jetzt so, mit dem Index als Namen. Ich bin es erstmal umgangen mit einer eigenen kleinen Funktion, finde ich aber nicht so schön. Eigentlich würde ich gern auf bestehende Funktionen zurückgreifen.
await this.json2iob_lite(item, id);
Der Payload sieht wie folgt aus.
{ "addresses": ["100.24.237.45", "fd7a:115c:f34e::b347:019a"], "id": "607993024204548320", "nodeId": "m3er3kYT4sg1CNTRL", "user": "cvoelkel76@gmail.com", "name": "samsung-christian.tail43a1b.ts.net", "hostname": "samsung SM-G980F", "clientVersion": "1.76.6-t1edcf9d46-g", "updateAvailable": false, "os": "android", "created": "2024-03-01T09:00:25Z", "lastSeen": "2024-12-18T12:41:20Z", "keyExpiryDisabled": false, "expires": "2025-05-03T18:21:30Z", "authorized": true, "isExternal": false, "machineKey": "mkey:e209f6782e650527e913e36fcc74", "nodeKey": "nodekey:643019f7b347ed1d", "tailnetLockKey": "nlpub:9f28c4e7c1f66da3b", "blocksIncomingConnections": false, "enabledRoutes": [], "advertisedRoutes": [], "clientConnectivity": { "endpoints": ["91.56.179.29:48133", "192.168.20.28:48133", "[a8b0:59f:9ab6:5b2b:2091:f593:bdae:308]:48133"], "mappingVariesByDestIP": false, "latency": {}, "clientSupports": { "hairPinning": null, "ipv6": false, "pcp": false, "pmp": false, "udp": true, "upnp": false } } }
Tjo, keine Ahnung. Habe bei dem json2iob Parser einige Sachen probiert, es kommt aber immer das gleiche heraus. Hat irgendwer einen Tipp? Ich könnte noch versuchen den Payload anzupassen, bevor ich ihn in den Parser schicke . . . ist aber auch eher unschön.
-
gelöscht
-
Ich verstehe nicht ganz was du willst.
Ein String in ein Json umwandeln geht mit:
const myjson = JSON.parse(jsonString)
zugriff auf einen Datenpunkt gibts mit:
const key = myjson. tailnetLockKey;
Zugriff auf das array:
const arr = myjson.clientConnectivit.endpoints; for (const item of arr) { log(item) }
über das ganze object rennst du mit:
function _findData(data) { if (typeof data === 'object') { if (Array.isArray(data)) { data.forEach(item => _findData(item)); } else { Object.keys(data).forEach(key => _findData(data[key]); } } else { log(data) } }
Da muß man jetzt noch den key zusammenbauen und übergeben damit man weiß woher die Daten kommen dat wird aber bissle unübersichtlich.
EDIT: hab in einem Skript ein Beispiel gefunden:
async function setKeys(id, result) { if (result === null) return if (typeof(result) === 'object') { if (result.isArray) { for (let a = 0; a<result.length; a++) { setKeys(id+'.'+a, result[a]) } } else { for (let key in result) { setKeys(id+'.'+key, result[key]) } } } else { if (existsState(id)) { setState(id, result, true) } else { // erzeuge State
-
@ticaki ja, die Infos waren ggf. etwas spärlich
Ich versuche gerade einen Adapter zu machen und lese eine API aus. Das erhaltene JSON soll dann im Adapter als Datenpunkte angelegt werden. Klar kann man alles selber schreiben. Es gibt aber wunderschöne Module wie TA2k/json2iob.
Hier habe ich das oben beschriebe Problem, das die Elemente als Namen genutzt werden. Das ist ja bei den meisten vielleicht auch kein Problem, allerdings bei IP Adressen erstellt er eben nicht einen Datenpunkt sondern Ordner mit den einzelnen IP Segmenten.
Ich dachte erst ich bin zu blöde, glaube aber das ist ein kleiner Fehler im json2iob. Habe mir mal den Code angeschaut einen Pull Request geschickt. Denke wenn alles passt sollte es in der nächsten Version richtig angelegt werden und ich erspare mir eine Menge eigenen Code.
-
ok ich hab mir den code einmal für mich geschrieben und benutze den einfach immer wieder.
-
Sei dir bitte bewußt dass json2iob KEIN vom Coreteam bereitgestellter Modul ist und daher prinzipiell jederzeit inkompatibel werden könnte (ich schreibe bewußt könnte, mir sind derzeit außer deinem Problem keine Fehler bekannt). Das Core-Team hat auf solche Privatmodule jedenfalls keinen Zugriff und kann daher auch im Notfall keinen Override setzen falls mal was inkompatibel wird und den Modul im allgemeinen auch nicht übernehmen falls der Maintainer nicht mehr aktiv ist.
Wenn du das json von extern bekommst musst du aber jedenfalls sicherstellen, dass
- die StateIds keine unzulässigen Zeichen enthalten. Keine Ahnung ob das in json2iob schon drinnen ist - wenn nicht musst du gegen adapter.FORBIDDEN_CHARS prüfen und diese Zeichen ersetzen.
- jedenfalls die Roles der States geeignet setzen - diese werden kaum von einer externen Quelle richtig geliefert werden.