PHP JSON декодировать странный формат

Я пытаюсь декодировать некоторые данные из моей системы 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 () не работает: — /

0

Решение

ну, вы все равно должны в первую очередь потребовать от тех, кто дал вам этот вывод, чтобы они исправили свой код и фактически предоставили 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));
1

По вопросам рекламы [email protected]