Как в 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}, ...
869   4  

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

    Ничего не найдено.