php json_encode & jquery parseProblem mit einfachen JSON-Anführungszeichen

Lesezeit: 4 Minuten

Benutzer-Avatar
zurück

Ich suchte und las die meisten verwandten Themen, aber sie waren nicht das, wonach ich suchte.

Ich habe eine JSON-codierte Zeichenfolge mit json_encode PHP-Funktion:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}

Ich arbeite mit jQuery, um die Werte auch in die entsprechenden Felder einzugeben. Beim Testen habe ich Folgendes getan:

<script>
var obj = jQuery.parseJSON('<?=$data?>');
console.log(obj);
</script>

Angenommen, $data ist dies:

$data =
<<<END
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}
END;

Was Google Chrome Console in diesem Fall produziert:

Uncaught SyntaxError: Unexpected identifier 

Wenn ich jedoch eine Änderung in der JSON-codierten Zeichenfolge vornehme – Hinzufügen Backslash zum einfachen Anführungszeichen:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987}

Die Konsolenausgabe ist wie gewohnt:

Object {casts: Array[3], year: 1987}
casts: Array[3]
year: 1987

Die Frage: wird dieser Fehler in der Konsole erwartet? Ich denke, entkommen oder ersetzen ' mit \' wird so dreckig sein!

AKTUALISIERT

Eigentlich $daten Wert kommt von a json_encode($var) und $var ist ein Array!

$data = json_encode($var);

Benutzer-Avatar
seanvalencourt

Für das umfassendere Problem der Übergabe eines JSON-codierten Strings in PHP (z. B. durch cURL) ist die Verwendung der JSON_HEX_APOS-Option der sauberste Weg, dieses Problem zu lösen. Dies würde auch Ihr Problem lösen, obwohl die vorherigen Antworten richtig sind, dass Sie dies nicht tun brauchen zum Aufrufen von parseJSON, und das JavaScript-Objekt ist das gleiche, ohne parseJSON aufzurufen $data.

Für Ihren Code würden Sie einfach diese Änderung vornehmen:

json_encode($var) zu json_encode($var, JSON_HEX_APOS).

Hier ist ein Beispiel für die korrekt codierten Daten, die von jQuery geparst werden: http://jsfiddle.net/SuttX/

Zur weiteren Lektüre hier ein Beispiel aus der PHP.net json_encode manueller Eintrag Beispiel #2:

$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9");

echo "Apos: ",    json_encode($a, JSON_HEX_APOS), "\n";

Dies wird ausgeben:

Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"]

Eine vollständige Liste der JSON-Konstanten finden Sie hier: PHP.net JSON-Konstanten

  • Das funktioniert perfekt. Für Leute, die Twig verwenden, lautet der Code json_encode(constant(‘JSON_HEX_APOS’)). Vielen Dank für diese Lösung.

    – Herr1031011

    11. November 2019 um 8:45 Uhr

  • Tolle Antwort, die mir auch geholfen hat

    – hell

    1. März 2021 um 16:03 Uhr

Wenn ich jedoch eine Änderung in der JSON-codierten Zeichenfolge vornehme, füge ich dem einfachen Anführungszeichen einen Backslash hinzu

Das maskiert es im PHP-String-Literal. Es wird dann als simple in den PHP-String eingefügt '.

Wenn Sie es maskieren möchten, bevor Sie es in JavaScript einfügen, müssen Sie der erhaltenen Zeichenfolge Schrägstriche hinzufügen aus von json_encode (oder besser gesagt, da Sie diesen (sollten!) JSON-String, den Sie von Hand erstellen, nicht verwenden).

Das ist aber mehr Arbeit als nötig. Die wirkliche Lösung besteht darin, sich daran zu erinnern, dass JSON eine Teilmenge der JavaScript-Literalsyntax ist:

var obj = <?=$data?>;

  • +1 keine Notwendigkeit, es zu analysieren – die Ausgabe von json_encode ist bereits gültiges JavaScript.

    – cmbuckley

    29. Juli 2013 um 14:20 Uhr


  • Es wäre gut zu spezifizieren JSON_HEX_TAG | JSON_HEX_AMP obwohl. Zumindest ersteres kann notwendig sein, um die zu befriedigen Beschränkungen für den Inhalt von script Elementeund beide sind erforderlich, wenn das Dokument als XML analysiert werden kann.

    – Bitte stehen

    29. Juli 2013 um 14:26 Uhr


  • Hallo – ein bisschen spät zur Party, aber ich hatte genau das gleiche Problem und das war die Lösung! Könnten Sie bitte genauer erklären, was <?=$data ?> meint? Ist das eine Kurzversion des Schreibens von ‘` oder ist das etwas anderes?

    – Allen S

    12. Mai 2014 um 14:08 Uhr

  • @user1775598 Du hast genau recht: <?= ist eine Abkürzung für <?php echo

    – seanvalencourt

    1. Oktober 2014 um 20:16 Uhr

Benutzer-Avatar
Orangenpille

Das Problem, mit dem Sie konfrontiert sind, ist, dass Sie die Ergebnisse der präsentieren json_encode Aufruf von JavaScript als Zeichenfolge, obwohl es sich um gültiges JavaScript handelt. Entferne das jQuery.jsonParse aus der Ausgabe heraus und weisen Sie einfach die geechoten Ergebnisse der betreffenden JavaScript-Variablen zu.

var obj = <?= json_encode(array("casts"=>array(
    "Matthew Modine","Adam Baldwin","Vincent D'Onofrio"
),"year"=>1987)); ?>;

  • Der obige Code wird für Sie funktionieren … er zeigt sich auch, wenn Sie den Schritt Javascript parseJson übergeben.

    – Orangenpille

    29. Juli 2013 um 14:22 Uhr

Dies sollte einfach sein, wenn es nur um einfache Anführungszeichen geht:

str_replace("'", "\'", json_encode($array));

Schau mal, es hilft mir wirklich

$products_arr=array();
$products_arr["category"]=array();
 while ($row = $cats->fetch(PDO::FETCH_ASSOC)){

    $product_item=array(
        "id" => $row['id'],
        "title" => json_encode($row['title'])// these will help you
    );

    array_push($products_arr["category"], $product_item);
}

echo json_encode($products_arr);

1251730cookie-checkphp json_encode & jquery parseProblem mit einfachen JSON-Anführungszeichen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy