Как в JSON закодировать PHP-массив, но ключи без кавычек
Я пытаюсь построить (с помощью Flot) круговую диаграмму с некоторыми данными
var data = <?php echo json_encode($data)?>
Результат, который я получаю из этого, таков:
var data = [
{"label":"Crear Usuario", "data":"2"},
{"label":"Impresoras", "data":"1"},
{"label":"Problema Correo", "data":"1"},
{"label":"Requisicion Equipo", "data":"1"},
{"label":"Sitio Web", "data":"1"}
]
Проблема здесь в том, что мне нужны label и data без кавычек, я уже пробовал json_encode($data, JSON_NUMERIC_CHECK);, но только удаляет кавычки из чисел.
Мне нужен следующий формат:
var data = [
{label:"Crear Usuario",data:2}, ...
4 ответов:
Во-первых, вы должны сгенерировать свой массив в php, чтобы значения данных были целыми числами, а не строками:
Я эмулировал Ваш массив из вашего json_encode (), я думаю, что это выглядит так (или должно выглядеть):
$array = array( array("label" => "Crear Usuario", "data" => 2), array("label" => "Impresoras", "data" => 1), array("label" => "Problema Correo", "data" => 1), array("label" => "Requisicion Equipo", "data" => 1), array("label" => "Sitio Web", "data" => 1) ); $data = json_encode($array);
- обратите внимание, что 2 и 1 не имеют кавычек, поэтому они являются целыми числами, это важно.
Тогда вы пропускаете в Javascript JSON.parse (), чтобы фактически сделать этот вывод в объект json:
<script> var data = '<?php echo $data; ?>'; var json = JSON.parse(data); console.log(json); console.log(json[0]); </script>
- обратите внимание, что данные var = ... одинарная кавычка, поэтому вы ловите эхо из php в виде строки
Консоль.log () выведет это для меня:
[Object, Object, Object, Object, Object] // First console.log(): one object with the 5 Objects. Object {label: "Crear Usuario", data: 2} // secons console log (json[0]) with the first objectПохоже на то, что вам нужно, я прав?
Нет разницы между ключами в кавычках и без кавычек. Проблема заключается в кавычках вокруг фактических значений данных, поскольку Flot требует чисел, а не строк.
Функция json_encode решает, следует ли цитировать, основываясь на типе данных, которые вы ей предоставляете. В этом случае похоже, что все операции, которые вы выполняете для создания $data, производят строковые значения вместо целых чисел. Вам нужно пересмотреть эти операции или явно сказать PHP интерпретировать их как числа, используя (int) или (float) приведение, или функции intval/floatval.
Попробуйте что-нибудь вроде этого:
function buildBrokenJson( array $data ) { $result = '{'; $separator = ''; foreach( $data as $key=>$val ) { $result .= $separator . $key . ':'; if( is_int( $val ) ) { $result .= $val; } elseif( is_string( $val ) ) { $result .= '"' . str_replace( '"', '\"', $val) . '"'; } elseif( is_bool( $val ) ) { $result .= $val ? 'true' : 'false'; } else { $result .= $val; } $separator = ', '; } $result .= '}'; return $result; }И при запуске
$a = array("string"=>'Crear "Usuario', 'foo'=>':', "int"=>2, "bool"=>false); var_dump( buildBrokenJson($a) );Это дает:
string(54) "{string:"Crear \"Usuario", foo:":", int:2, bool:false}"
Я создал класс для форматирования json с php без кавычек на ключах вот он
class JsonFormatter { static $result = ''; static $separator = ''; public static function iterateArray($data) : string { static::$result .= '['; static::$separator = ''; foreach ($data as $key => $val) { if (is_int($val)) { } elseif (is_string($val)) { static::$result .= '"' . str_replace('"', '\"', $val) . '"'; } elseif (is_bool($val)) { static::$result .= $val ? 'true' : 'false'; } elseif (is_object($val)) { static::iterateObject($val); static::$result .= ', '; } elseif (is_array($val)) { static::iterateArray($val); static::$result .= ', '; } else { static::$result .= $val; } if (!is_int($val)) { static::$separator = ', '; } } static::$result .= ']'; return static::$result; } public static function iterate($data) { if (is_array($data)) { static::iterateArray($data); } elseif (is_object($data)) { static::iterateObject($data); } return static::$result; } public static function iterateObject($data) { static::$result .= '{'; static::$separator = ''; foreach ($data as $key => $val) { static::$result .= static::$separator . $key . ':'; if (is_int($val)) { static::$result .= $val; } elseif (is_string($val)) { static::$result .= '"' . str_replace('"', '\"', $val) . '"'; } elseif (is_bool($val)) { static::$result .= $val ? 'true' : 'false'; } elseif (is_object($val)) { static::iterate($val, true); static::$result .= ', '; } elseif (is_array($val)) { static::iterateArray($val, true); static::$result .= ', '; } else { static::$result .= $val; } static::$separator = ', '; } static::$result .= '}'; return static::$result; } }Теперь вы можете позвонить
$jsonWithoutKeyQuotes = JsonFormatter::iterate($data);Спасибо Марцину Орловскому
Comments