2016-11-19 9 views
0

私のIPアラームシステムからデータをデコードしようとしています。私はデータがjsonであり、htmlファイルを見ていると言われていますが、jsonへの参照があります。問題は、それがここphp json奇妙なフォーマットをデコードする

:-)少し奇妙に見えるということであるアラームからの生出力されます。

/*-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"}] } */ 

このデータをデコードする方法?

json_decode()が動作しません:-): -/

+0

実際のJSON形式を使用するには、事前に処理する必要があるようです。 –

+0

jsonは無効です。キーに引用符がありません。 –

+1

誰かがこれを言ったのはJSONです。これが**有効ではないことを伝えてください。 JSONでは、キーを '' senrows ''のように引用符で囲む必要があります。私は恐れがありませんがすぐに修正されていません - あなたは自分自身で文字列を解析し、文字列にない文字列をすべて引用符で囲む必要があります。実際にこれを作ってコードを修正するよう要求する人には、本当に不平を言うべきです。 –

答えて

1

だけでなく、あなたはまだすべき最初の、そしてあなたに、彼らは自分のコードを修正して、実際にJSONを提供し、この出力を与えた誰から一番需要。

まだまだ、私は数分の時間があり、あなたのデータの迅速な修正を書くためのコーディング練習を楽しんでいました。
あなたのコードがいつも同じ-secure-で始まる場合にのみ動作します。それ以外の場合は、それを適合させる必要があります。

、それが失敗したり、何らかの理由でカプセル化された文字列でフィールドを持っている場合a:"text\"moretext\"finaltext"のような、奇妙な結果を生むか、プロバイダはあなたの例に示したもの以外に、他のミスを紹介します。

<?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

あなたが持っている可能性があります非常にハックな解決策と勇気がありません。この状況を処理する方法はたくさんありますが、アラームシステムの作成者に有効なJSONの作成を依頼するのが最善の方法です。

<?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

素晴らしいコードですが、潜在的な問題もあります。たとえば、 '' {field: "some:thing"} ''という入力では、データが破壊されます。 –

+0

'/ * - secure- {senrows:'は結果からフィルタリングされなければならない:-)の注釈を追加する必要があります。 – DrDice