Как json_encode 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}, ...
Ответы
Ответ 1
Сначала вы должны сгенерировать свой массив в 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 =... являются SINGLE QUOTED, поэтому вы обнаруживаете эхо от 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
Похоже, что вам нужно, я прав?
Ответ 2
Нет никакой разницы между цитируемыми и неуказанными ключами. Проблема заключается в цитировании вокруг фактических значений данных, поскольку Флот требует чисел, а не строк.
Функция json_encode решает, следует ли указывать на основе типа данных, которые вы ему даете. В этом случае, похоже, что все операции, которые вы выполняете для создания $data, производят строковые значения вместо целых чисел. Вам нужно пересмотреть эти операции или явно указать PHP, чтобы интерпретировать их как числа, используя (int) или (float) casting, или функции intval/floatval.
Ответ 3
Попробуйте что-то вроде этого:
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}"
Ответ 4
Я создал класс для форматирования 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);
благодаря Марцину Орловскому
Ответ 5
TL; DR: пропущенные кавычки - это то, как Chrome показывает, что это объект JSON, а не строка. Убедитесь, что у вас есть заголовок ('Content-Type: application/json; charset = UTF8'); в PHP ответ AJAX, чтобы решить реальную проблему.
ДЕТАЛИ. Распространенной причиной желания решить эту проблему является обнаружение этой разницы при отладке обработки возвращенных данных AJAX.
В моем случае я увидел разницу, используя инструменты отладки Chrome. При успешном подключении к устаревшей системе Chrome показал, что в ответе отладчика не было показано никаких кавычек вокруг ключей в ответе. Это позволило объекту быть немедленно обработанным как объект без использования вызова JSON.parse(). При отладке моего нового назначения AJAX в ответе были показаны кавычки, а переменная была строкой, а не объектом.
Я наконец осознал истинную проблему, когда я протестировал ответ AJAX, когда увидел, что унаследованная система на самом деле содержала кавычки вокруг клавиш. Это было не то, что показали инструменты разработчика Chrome. Единственным отличием было то, что в прежней системе был заголовок, указывающий тип контента. Я добавил это в новую систему (WordPress), и теперь вызовы были полностью совместимы с исходным скриптом, и функция успеха могла обрабатывать ответ как объект без какого-либо анализа. Теперь я могу переключаться между устаревшей и новой системой без каких-либо изменений, кроме целевого URL.