2016-11-19 5 views
0

Ich versuche, einige Daten von meinem IP-Alarmsystem zu entschlüsseln. Mir wurde gesagt, dass die Daten json sind, und beim Durchsehen der HTML-Dateien gibt es Verweise auf json. Das Problem ist, dass es :-)php json decode seltsames Format

Hier sind die Rohausgangssignal vom Alarm ein wenig seltsam aussieht:

/*-secure- { senrows : [ {no : "1", type : "Door Contact", zone : "1", name : "zone1", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "2", type : "Door Contact", zone : "2", name : "zone2", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "3", type : "Door Contact", zone : "3", name : "zone3", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "4", type : "Door Contact", zone : "4", name : "zone4", attr : "Burglar", cond : "", battery : "Low", tamp : "", bypass : "No"}, {no : "5", type : "Door Contact", zone : "5", name : "zone5", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "6", type : "Door Contact", zone : "6", name : "zone6", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "7", type : "Door Contact", zone : "7", name : "zone7", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "8", type : "Door Contact", zone : "8", name : "zone8", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "9", type : "Door Contact", zone : "9", name : "zone9", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "10", type : "IR Sensor", zone : "10", name : "zone10", attr : "Burglar", cond : "", battery : "Low", tamp : "", bypass : "No"}, {no : "11", type : "Remote Keypad", zone : "11", name : "zone11", attr : "",cond : "", battery : "", tamp : "", bypass : "No"}] } */ 

, wie diese Daten dekodieren ?? :-)

json_decode() funktioniert nicht: -/

+0

Es scheint, dass Sie es vorher verarbeiten müssen, um in echtes JSON-Format zu setzen. –

+0

JSON ist nicht gültig. Zitate fehlen bei Schlüsseln. –

+1

Wer Ihnen gesagt hat, dass JSON ausgelöst werden soll. Sag ihm, dass das ** nicht ** gültig ist. JSON benötigt Schlüssel, die in Anführungszeichen eingeschlossen werden, wie "senrows". Ich fürchte, es gibt keine schnelle Lösung - Sie müssen die Zeichenfolge selbst analysieren und Zitate um jedes Wort platzieren, das noch nicht in einer Zeichenfolge ist. aber Sie sollten sich wirklich darüber beschweren, wer auch immer dies gemacht hat und verlangen, dass sie ihren Code reparieren. –

Antwort

1

gut, noch sollte man in erster Linie die Nachfrage aus, wer hat dir diese Ausgabe, dass sie ihren Code zu beheben und tatsächlich JSON liefern.

noch hatte ich ein paar Minuten und genoss die Codierung Übung, um eine schnelle Lösung für Ihre Daten zu schreiben.
es funktioniert nur, wenn Ihr Code immer mit dem gleichen -secure- startet, sonst müssen Sie es anpassen.

und es wird scheitern oder seltsame Ergebnisse produzieren, wenn Sie aus irgendeinem Grund ein Feld mit gekapselten Saiten haben, wie a:"text\"moretext\"finaltext", oder wenn die Anbieter einführen andere Fehler außer den im gezeigten Beispiel diejenigen.

<?php 
$data = /*your not-JSON-string*/; 

function fix_botched_json($data) { 
    //remove comment-section, we don't need it 
    $data = substr($data, 10, strlen($data)-12); 
    $seek = '/(\w+)/'; 
    $exploded = explode('"', $data); 
    //explode so we only replace *outside* of strings 

    $outside = true; 
    foreach($exploded as &$item) { 
     if($outside) { 
      //the regex matches only word characters. 
      $item = preg_replace($seek, '"\1"', $item); 
     } 
     //alternating between inside and outside of strings 
     $outside = !$outside; 
    } 
    //piece it back together 
    $imploded = implode('"', $exploded); 

    return $imploded; 
} 


$final = json_decode(fix_botched_json($data), true); 
1

sehr hacky Lösung und nicht guranteed mit anderen Strings zu arbeiten, die Sie haben können. Es gibt viele Möglichkeiten, wie Sie mit dieser Situation umgehen können. Der beste Weg könnte sein, den Ersteller des Alarmsystems zu bitten, ein gültiges JSON zu erstellen!

<?php 

$string = '/*-secure- { senrows : [ {no : "1", type : "Door Contact", zone : "1", name : "zone1", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "2", type : "Door Contact", zone : "2", name : "zone2", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "3", type : "Door Contact", zone : "3", name : "zone3", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "4", type : "Door Contact", zone : "4", name : "zone4", attr : "Burglar", cond : "", battery : "Low", tamp : "", bypass : "No"}, {no : "5", type : "Door Contact", zone : "5", name : "zone5", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "6", type : "Door Contact", zone : "6", name : "zone6", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "7", type : "Door Contact", zone : "7", name : "zone7", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "8", type : "Door Contact", zone : "8", name : "zone8", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "9", type : "Door Contact", zone : "9", name : "zone9", attr : "Burglar", cond : "", battery : "", tamp : "", bypass : "No"}, {no : "10", type : "IR Sensor", zone : "10", name : "zone10", attr : "Burglar", cond : "", battery : "Low", tamp : "", bypass : "No"}, {no : "11", type : "Remote Keypad", zone : "11", name : "zone11", attr : "",cond : "", battery : "", tamp : "", bypass : "No"}] } */'; 

function fix_json($st){ 
    $regex = '/([a-zA-Z0-9_]+)(\s)(?=:)/i'; 
    return preg_replace($regex, '"$1"', $st); 
} 

$step1 = strstr($string, '{'); 
$step2 = rtrim($step1, '*/'); 


$data = fix_json($step2); 

var_dump(json_decode($data, true)); 
+0

netter Code, aber es hat auch potentielle Probleme. zum Beispiel mit der Eingabe "{field:" some: thing "}", werden die Daten gebrochen. Sie sollten eine Notiz dafür hinzufügen –

+0

'/ * - secure- {sentrows:' muss aus dem Ergebnis gefiltert werden :-) Sieht wie ein schönes Beispiel aus, mit dem ich arbeiten kann :-) – DrDice