json auswerten

Hallo,
ich verzweifel grade :frowning:

ich versuche aus einer json die clientzahlen verschiedener nodes auszulesen.
im grunde ja recht simpel mit dem textparser machbar. wäre da nicht das problem, das die json nicht immer den gleichen aufbau hat.

es handelt sich um folgende json:
http://map.erfurt.freifunk.net/meshviewer/nodes.json

hat evtl jemand eine idee oder kann mir helfen?
wäre super!

viele grüße!

Es gibt PHP Funktionen, um json als Array auszuwerten.

$json_array = json_decode($json_String);

Und das array kannst du dann weiterverwenden.

Weil ich etwas ähnliches schon für nord.freifunk.net gemacht habe hier etwas Code:


$a = json_decode($alfred_json);
	
	foreach($a->nodes as $knoten) {
		$clients = $knoten->statistics->clients;
                ......
	}

vielen dank!!!
ich werde testen!

wie bekommst du die json denn in eine string variable?
via textparser läuft es irgendwie nicht… man muss ja immer angeben nach was er suchen sollte… er soll ja aber alles in den string schreiben… hänge da grad irgendwie fest

Moin,

ich nehme einfach den Befehl file_get_contents mit der URL der JSON.


$url = "http://mesh.nord.freifunk.net/data/nodes.json";                                                                                       
if (get_http_response_code($url) != "200"){                                                                                                   
    die("JSON not accessabile");                                                                                                              
} else {                                                                                                                                      
        $alfred = file_get_contents($url);                                                                                                    
        $a = json_decode($alfred);
        .....

Sollte das aus irgendeinem Grunde mit file_get_contents nicht gehen kannst Du auch curl benutzen.

hab sie mit file_get_contents nun in eine string packen können :slight_smile:

zu spät gesehen… danke!

könntest du mir vllt dein ganzes script mal posten? denn auch in der decode variante kann ich da keinerlei zusammenhänge erkennen…

also die clientzahl auslesen und einfach mal für alle aufsummieren habe ich geschafft…
mir ist nur schleierhaft wie ich in der schleife nun die aussortiere die ich wirklich beobachten will…

jetzt ist der groschen gefallen!

:slight_smile: Dann ist ja wunderbar!

läuft wunderbar! vielen herzlichen dank!

Ich bin grade an einem ähnlichen Problem dran - könntet Ihr bitte mal Eure Skripte hier zur Verfügung stellen?

Was ist denn das Problem?

Ich möchte gern die Daten von bestimmten nodes auslesen.

Dann musst Du schon mal schreiben wie das JSON aussieht dann kann man Dir vielleicht auch helfen.

Ansonsten eben $data = json_decode($jsonstring);
Dann hast Du ein Standardobjekt und kannst dann die Nodes ansprechen mit
$element1 = $data->element1;
$unterelement2 = $data->element1->unterelement;

Das hier ist die json-Ausgangsdatei - es sind aber ca 1000 nodes drin - ich hab die etwas gekürzt:

{„timestamp“:„2016-10-18T10:17:06“,„nodes“:{„60e327be2010“:{„nodeinfo“:{„network“:{„mesh_interfaces“:[„62:e7:27:be:20:10“,„62:e6:28:be:20:10“],„mac“:„60:e3:27:be:20:10“,„mesh“:{„bat0“:{„interfaces“:{„wireless“:[„62:e6:28:be:20:10“],„tunnel“:[„62:e7:27:be:20:10“]}}},„addresses“:[„fdda:fee6:187:0:62e3:27ff:febe:2010“,„2a03:2267:4e6f:7264:62e3:27ff:febe:2010“,„fe80::62e3:27ff:febe:2010“]},„hostname“:„FFNH-Handeloh-021“,„system“:{„site_code“:„ffnord“},„hardware“:{„model“:„TP-Link TL-WR841N/ND v10“,„nproc“:1},„node_id“:„60e327be2010“,„location“:{„latitude“:53.24679290499842,„longitude“:9.841645002234145},„software“:{„status-page“:{„api“:1},„firmware“:{„release“:„0.16.5“,„base“:„gluon-v2016.1.5“},„fastd“:{„version“:„v17“,„enabled“:true},„batman-adv“:{„compat“:14,„version“:„2013.4.0“},„autoupdater“:{„enabled“:true,„branch“:„stable“}}},„statistics“:{„uptime“:8035292.53,„memory_usage“:0.7804980414101846,„clients“:0,„rootfs_usage“:0.5446428571428572,„loadavg“:0.07,„traffic“:{„forward“:{„bytes“:10877134034,„packets“:15752140},„rx“:{„bytes“:73580447880,„packets“:874171336},„mgmt_tx“:{„bytes“:68481938761,„packets“:207917567},„tx“:{„bytes“:510538876,„packets“:2570878,„dropped“:2639},„mgmt_rx“:{„bytes“:62459359239,„packets“:272783175}},„gateway“:„feedbeefff04“},„flags“:{„gateway“:false,„online“:true},„lastseen“:„2016-10-18T10:17:06“,„firstseen“:„2016-09-20T05:26:01“},„f4f26d3faca6“:{„nodeinfo“:{„network“:{„mac“:„f4:f2:6d:3f:ac:a6“,„mesh“:{„bat0“:{„interfaces“:{„wireless“:[„f6:f5:6e:3f:ac:a6“],„tunnel“:[„f6:f6:6d:3f:ac:a6“]}}},„addresses“:[„2a03:2267:4e6f:7264:f6f2:6dff:fe3f:aca6“,„fe80::f6f2:6dff:fe3f:aca6“,„fdda:fee6:187:0:f6f2:6dff:fe3f:aca6“]},„hostname“:„FF-BU-HDHB37“,„system“:{„site_code“:„ffnord“},„hardware“:{„model“:„TP-Link TL-WR841N/ND v10“,„nproc“:1},„node_id“:„f4f26d3faca6“,„location“:{„latitude“:54.00064215636883,„longitude“:9.268864989062422},„software“:{„status-page“:{„api“:1},„firmware“:{„release“:„0.16.5“,„base“:„gluon-v2016.1.5“},„fastd“:{„version“:„v17“,„enabled“:true},„autoupdater“:{„enabled“:true,„branch“:„stable“},„batman-adv“:{„compat“:14,„version“:„2013.4.0“}}},„statistics“:{„clients“:0},„flags“:{„gateway“:false,„online“:false},„lastseen“:„2016-10-11T06:44:05“,„firstseen“:„2016-09-20T05:26:01“},„60e327c72204“:{„nodeinfo“:{„network“:{„mac“:„60:e3:27:c7:22:04“,„mesh“:{„bat0“:{„interfaces“:{„wireless“:[„62:e6:28:c7:22:04“],„tunnel“:[„62:e7:27:c7:22:04“]}}},„addresses“:[„fdda:fee6:187:0:62e3:27ff:fec7:2204“,„2a03:2267:4e6f:7264:62e3:27ff:fec7:2204“,„fe80::62e3:27ff:fec7:2204“]},„hostname“:„FF-BU-GM4“,„system“:{„site_code“:„ffnord“},„hardware“:{„model“:„TP-Link TL-WR841N/ND v10“,„nproc“:1},„node_id“:„60e327c72204“,„location“:{„latitude“:53.99623833595264,„longitude“:9.2618010006845},„software“:{„status-page“:{„api“:1},„firmware“:{„release“:„0.16.5“,„base“:„gluon-v2016.1.5“},„fastd“:{„version“:„v17“,„enabled“:true},„batman-adv“:{„compat“:14,„version“:„2013.4.0“},„autoupdater“:{„enabled“:true,„branch“:„stable“}}},„statistics“:{„uptime“:266004.38,„memory_usage“:0.8178511471740347,„clients“:0,„rootfs_usage“:0.5625,„loadavg“:0.2899999999999999,„traffic“:{„forward“:{„bytes“:115906518,„packets“:896853},„rx“:{„bytes“:2897195976,„packets“:29780823},„mgmt_tx“:{„bytes“:1055194666,„packets“:4219720},„tx“:{„bytes“:50714839,„packets“:461784,„dropped“:362},„mgmt_rx“:{„bytes“:3889249438,„packets“:14906450}},„gateway“:„feedbeefff07“},„flags“:{„gateway“:false,„online“:true},„lastseen“:„2016-10-18T10:17:06“,„firstseen“:„2016-09-28T09:36:06“},„6466b34868fb“:{„nodeinfo“:{„network“:{„mac“:„64:66:b3:48:68:fb“,„mesh“:{„bat0“:{„interfaces“:{„wireless“:[„66:69:b4:48:68:fb“],„tunnel“:[„66:6a:b3:48:68:fb“]}}},„addresses“:[„fdda:fee6:187:0:6666:b3ff:fe48:68fb“,„2a03:2267:4e6f:7264:6666:b3ff:fe48:68fb“,„fe80::6666:b3ff:fe48:68fb“]},„hostname“:„Fotoristisch“,„system“:{„site_code“:„ffnord“},„hardware“:{„model“:„TP-Link TL-WA801N/ND v2“,„nproc“:1},„node_id“:„6466b34868fb“,„location“:{„latitude“:54.23502968113736,„longitude“:10.285723563283682},„software“:{„status-page“:{„api“:1},„firmware“:{„release“:„0.16.5“,„base“:„gluon-v2016.1.5“},„batman-adv“:{„compat“:14,„version“:„2013.4.0“},„autoupdater“:{„enabled“:true,„branch“:„stable“},„fastd“:{„version“:„v17“,„enabled“:true}}},„statistics“:{„clients“:0},„flags“:{„gateway“:false,„online“:false},„lastseen“:„2016-10-14T15:34:05“,„firstseen“:„2016-09-20T05:26:01“}}}

Ich habe schon mit Arrays gearbeitet - aber nicht mit „verschachtelten“ Arrays.

Als erstes würde ich die Ausgangsdatei mal mit einem Editor formatieren oder aber einer JSON Validator und Formatter nutzten damit Du siehst ob das JSON so überhaupt gültig ist bzw. Du einen Überblick bekommst wie was verschachtelt ist.
Zum Beispiel mit
JSON Formatter & Validator
Hier wirst Du auch gleich feststellen das dein JSON Fehler enthält diese musst Du alle beheben sonst funktioniert json_decode nicht. Wenn das JSON gültig ist wandelst Du das JSON in einen Array um mit

$data = json_decode($jsonstring, true);

Den Array kannst Du jetzt entweder mit einer selbst geschrieben Funktion durchlaufen indem pro Ebene mit foreach nach der node gesucht wird.
Wenn Du einen bestimmten Wert suchst geht es sehr viel einfacher mit

$key = array_search("wert", array_column($data, 'keyname'));

PHP: array_search - Manual