wake-up-neo.net

Wie json_encode PHP Array aber die Schlüssel ohne Anführungszeichen

Ich versuche, (mit Flot ) ein Kreisdiagramm mit einigen Daten zu zeichnen

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

Das Ergebnis, das ich davon bekomme, ist folgendes:

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

Das Problem hier ist, dass ich label und data ohne die Anführungszeichen brauche, ich habe bereits json_encode($data, JSON_NUMERIC_CHECK); versucht, aber nur die Anführungszeichen aus den Zahlen entfernt.

Folgendes Format brauche ich:

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

Zuerst müssen Sie Ihr Array in PHP generieren, damit der Wert der Daten ganze Zahlen sind, keine Strings:

Ich habe Ihr Array von Ihrem json_encode () emuliert, ich denke, es sieht so aus (oder sollte es):

$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);
  • Beachten Sie, dass die 2 und 1 nicht notiert sind. Auf diese Weise sind sie Ganzzahlen. Dies ist wichtig.

Dann verpassen Sie in Javascript die JSON.parse (), um diese Ausgabe tatsächlich in ein Json-Objekt umzuwandeln:

<script>
    var data = '<?php echo $data; ?>';
    var json = JSON.parse(data);
    console.log(json);
    console.log(json[0]);
</script>
  • Beachten Sie, dass var data = ... SINGLE QUOTED ist, also fangen Sie das Echo von php als String ein

Die console.log () hat folgendes für mich ausgegeben:

[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 

Sieht aus, was Sie brauchen, habe ich recht?

11
aleation

Es gibt keinen Unterschied zwischen zitierten und nicht zitierten Schlüsseln. Das Problem liegt bei den Zitaten um die tatsächlichen Datenwerte, da Flot Zahlen und keine Strings benötigt.

Die json_encode-Funktion entscheidet auf der Grundlage der Art der Daten, die Sie ihnen geben, ob sie ein Angebot machen soll. In diesem Fall sieht es so aus, als würden alle Vorgänge, die Sie zum Erstellen von $ data ausführen, Zeichenfolgenwerte anstelle von Ganzzahlen erzeugen. Sie müssen diese Vorgänge erneut prüfen oder PHP explizit sagen, dass sie als Zahlen interpretiert werden sollen, und zwar mit (int) oder (float) Casting oder mit den Funktionen intval/floatval.

6
DNS

Versuchen Sie etwas so:

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

und wann laufen 

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

es gibt:

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

TL; DR: Fehlende Anführungszeichen zeigen, wie Chrome zeigt, dass es sich um ein JSON-Objekt anstelle eines Strings handelt. Stellen Sie sicher, dass Sie einen Header haben ('Content-Type: application/json; charset = UTF8'); in PHP AJAX Antwort auf das eigentliche Problem zu lösen.

DETAILS: Ein häufiger Grund für das Lösen dieses Problems liegt darin, dass dieser Unterschied beim Debuggen der Verarbeitung der zurückgegebenen AJAX Daten festgestellt wird.

In meinem Fall habe ich den Unterschied mit den Debugging-Tools von Chrome festgestellt. Bei erfolgreicher Verbindung mit dem Altsystem zeigte Chrome), dass in der Antwort laut Debugger keine Anführungszeichen um Schlüssel angezeigt wurden. Dadurch konnte das Objekt sofort als Objekt ohne Verwendung von behandelt werden Ein Aufruf von JSON.parse (). Beim Debuggen meines neuen Ziels AJAX=) wurden in der Antwort Anführungszeichen angezeigt, und die Variable war eine Zeichenfolge und kein Objekt.
Ich erkannte endlich das wahre Problem, als ich die AJAX) Antwort von außen sah, dass das Altsystem tatsächlich DID) Anführungszeichen um die Schlüssel hatte nicht das, was die Chrome dev-Tools zeigten. Der einzige Unterschied war, dass auf dem Altsystem eine Kopfzeile vorhanden war, die den Inhaltstyp spezifizierte. Ich fügte dies dem neuen (WordPress) System hinzu und die Aufrufe waren jetzt Vollständig kompatibel mit dem ursprünglichen Skript und der Erfolgsfunktion konnte die Antwort als Objekt behandelt werden, ohne dass ein Parsing erforderlich war. Jetzt kann ich ohne Änderungen außer der Ziel-URL zwischen dem alten und dem neuen System wechseln.

0
Brian Layman

Ich habe eine Klasse zum Formatieren von Json mit PHP ohne Anführungszeichen auf den Schlüsseln erstellt. Hier ist es

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

}

sie können jetzt anrufen

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

danke an Marcin Orlowski

0
Ekene Madunagu