php json解码奇怪的格式
php json decode weird format
我正在尝试解码来自我的 IP 警报系统的一些数据。我被告知数据是 json,并且查看 html 文件,有对 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() 不起作用:-/
嗯,你仍然应该首先要求给你这个输出的人修复他们的代码并实际交付 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, '""', $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);
非常棘手的解决方案,不能保证与您可能拥有的其他字符串一起使用。有很多方法可以处理这种情况,最好的方法可能是要求警报系统的创建者开始生成有效的 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, '""', $st);
}
$step1 = strstr($string, '{');
$step2 = rtrim($step1, '*/');
$data = fix_json($step2);
var_dump(json_decode($data, true));
我正在尝试解码来自我的 IP 警报系统的一些数据。我被告知数据是 json,并且查看 html 文件,有对 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() 不起作用:-/
嗯,你仍然应该首先要求给你这个输出的人修复他们的代码并实际交付 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, '""', $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);
非常棘手的解决方案,不能保证与您可能拥有的其他字符串一起使用。有很多方法可以处理这种情况,最好的方法可能是要求警报系统的创建者开始生成有效的 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, '""', $st);
}
$step1 = strstr($string, '{');
$step2 = rtrim($step1, '*/');
$data = fix_json($step2);
var_dump(json_decode($data, true));