web-dev-qa-db-fra.com

Comment json_encode tableau php mais les clés sans guillemets

J'essaie de tracer (avec Flot ) un graphique à secteurs avec des données

var data = <?php echo json_encode($data)?>

Le résultat que j'en tire est le suivant:

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"}
]

Le problème ici est que j'ai besoin de label et data sans les guillemets, j'ai déjà essayé json_encode($data, JSON_NUMERIC_CHECK); mais ne supprime que les guillemets des nombres.

Le format suivant est ce dont j'ai besoin:

var data = [
    {label:"Crear Usuario",data:2}, ...
17
Danny

Tout d'abord, vous devez générer votre tableau en php afin que la valeur des données soient des entiers, pas des chaînes:

J'ai imité votre tableau à partir de votre json_encode (), je suppose qu'il ressemble à ceci (ou qu'il devrait):

$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);
  • Notez que les 2 et 1 ne sont pas entre guillemets, alors de cette façon ce sont des entiers, ceci est important.

Alors vous manquez en Javascript le JSON.parse () pour faire cette sortie dans un objet json:

<script>
    var data = '<?php echo $data; ?>';
    var json = JSON.parse(data);
    console.log(json);
    console.log(json[0]);
</script>
  • Notez que var data = ... est SIMPLE COTÉ. Vous obtenez ainsi l'écho de php sous forme de chaîne

La sortie de console.log () est la suivante:

[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 

On dirait ce dont vous avez besoin, n'est-ce pas?

11
aleation

Il n'y a pas de différence entre les clés citées et non citées. Le problème concerne les guillemets autour des valeurs de données réelles, car Flot nécessite des chiffres et non des chaînes.

La fonction json_encode décide de citer ou non le devis en fonction du type de données que vous lui donnez. Dans ce cas, il semble que les opérations que vous effectuez pour créer $ data produisent des valeurs de chaîne plutôt que des entiers. Vous devez réexaminer ces opérations ou indiquer explicitement à PHP de les interpréter en tant que nombres, à l'aide de la conversion (int) ou (float), ou des fonctions intval/floatval.

6
DNS

Essayez quelque chose comme ça:

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;
}

et quand couru 

$a = array("string"=>'Crear "Usuario', 'foo'=>':', "int"=>2, "bool"=>false);
var_dump( buildBrokenJson($a) );

il donne:

string(54) "{string:"Crear \"Usuario", foo:":", int:2, bool:false}"
3
Marcin Orlowski

J'ai créé une classe pour formater JSON avec php sans guillemets sur les clés voici

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;
}

}

vous pouvez maintenant appeler

$jsonWithoutKeyQuotes  = JsonFormatter::iterate($data);

merci à Marcin Orlowski

0
Ekene Madunagu