die Funktionen json_encode erstellen eine fehlerhafte JSON (mit extra versteckten Charakter)

Bin ich mit Hilfe von PHP - json_encode() wieder einige Daten, abgerufen durch die jQuery -ajax():

Vereinfachte JS:

$.ajax({
    dataType: 'json',
    contentType: 'application/json',
    cache: false,
    type: 'POST',
    url: './api/_imgdown.php',
    error: function(jqXHR, textStatus, errorThrow) {
        console.log(jqXHR, textStatus, errorThrow);
    },
    success: function(data, textStatus, jqXHR) {
        console.log(data, textStatus, jqXHR);
    }
});

PHP ist:

header('Content-Type: application/json; charset=UTF-8');
//default apiResponse
$apiResponse = [
    "status" => 1,
    "message" => "success",
    "data" => null
];

Dann, wenn php läuft mein code, es endet, indem diese Daten:

$apiResponse['data'][] = [
    "mid" => (int)$mid,
    "card_type" => $card_type,
    "header_size" => (int)$headers['Content-Length'],
    "saved_size" => (int)filesize($imgSavePath),
    "saved_path" => $imgSavePath
];
//spit out the JSON
echo json_encode($apiResponse);
exit();

JSON:

{"status":1,"message":"success","data":[{"mid":340052,"card_type":"kakusei","header_size":48337,"saved_size":48337,"saved_path":"..\/card\/kakusei\/340052.png"}]}

Zunächst scheint es gültig ist. Mein Ajax, ruft das PHP endet immer mit parseerror (also geht in die error Teil ajax()).

Wenn Sie kopieren und einfügen dieser JSON auf http://jsonlint.com/, es sagt "Unerwartetes token" und http://jsonformatter.curiousconcept.com/ sagt, ist nicht gültig.

Ich habe versucht echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES); obwohl die Flucht Schrägstriche ist ok \/ aber keinen Unterschied gemacht.

Aber was nicht genau gültig? War nicht PHP zurückgeben sollte, gültiges JSON?

Extra-info: die Prüfung auf Windows7, Chrome v28.XX mit PHP 5.4.XX auf Apache

Fragen, die ich gelesen habe eigentlich vor dieses posting ein:


Update:

Kopieren von SO in JSONlint gibt gültige json. So untersuchte ich ein wenig weiter und bemerkte die PHP ist die Erstellung einer seltsamen versteckten Zeichen, das Sie tatsächlich machen json ist ungültig. Siehe unten screenshot. Wie ich den Fehler beheben?
die Funktionen json_encode erstellen eine fehlerhafte JSON (mit extra versteckten Charakter)

  • JSONLint zeigt es, gut zu sein.
  • Ihre json gültig ist, und php ist gültig. Meine Vermutung, es ist dein ajax-call. Versuchen Sie es mit $.getJSON ein einfacher ajax-Aufruf zum anfordern von json
  • Zeigt seine gültig auf jsonlint.
  • Gültig auf jsonformatter zu.
  • Frage: Können Sie versuchen, ändern $apiResponse['data'][] = [ zu $apiResponse['data'] = [ und sehen, ob es dann besser funktioniert ? Ich verstehe nicht, warum Sie das hinzufügen Ihrer data element als array mit einem anderen array innerhalb, sollte es in Ordnung sein als eine single-level-array (es sei denn, Sie es wirklich brauchen).
  • Vielleicht haben Sie einige versteckte Zeichen in der Zeichenfolge, jQuery drosseln auf.
  • Sie haben einigen text-Ausgabe ab, bevor Sie Ihre php-Ausgabe
  • An alle, die Hinzugefügt Kommentar: Bitte Lesen Sie die update, ich habe gefunden, was ist das eigentliche problem (dass beim einfügen auf Stackoverflow eigentlich 'fest', ist daher nicht unwirksam mehr).
  • NÖ, habe ich überprüft. Zeile 1 beginnt mit <?php, Letzte Zeile endet mit ?>, keine zusätzlichen Leerzeichen oder so etwas.
  • Kann es sein, einen BOM-Zeichen, aber ich habe keine Ahnung, warum es da ist... Könnten Sie bestimmen den ASCII-code des ersten Zeichens in der die Daten zurückgeben? Verwenden console.log(data.charCodeAt(0)).
  • 65279. Und jetzt, wo Sie sagte, die Codierung Spare ich mit meinem text-editor ist utf-8 with bom (weil BOM akzeptiert áãà und andere Sachen, ohne die ich dass Sie tatsächlich konvertieren, um den html-entities). Aber die Tests speichern Sie die Datei wie üblich utf-8 gearbeitet (json ist jetzt auch wirklich gültig!). Sie haben eine Idee, was das erste Zeichen ist?
  • Könnte es sein, dass sehr BOM-Zeichen in der Tat. Aber alle meine PHP-Dateien werden immer in UTF-8 mit BOM mark und ich echo json all der Zeit, genau wie Sie und ich nie ein problem. Encoding-Probleme sind immer ärgerlich 🙂 ich habe es als eine echte Antwort 🙂
  • Nur um zu erklären, die $apiResponse['data'][] = [, 'Daten' werden mehr Elemente aufnehmen, so dass auf diese Weise die endgültige json wird "data":[ { /*one object*/ }, { /* another object*/}]. Vereinfachte ich die code, aber ich habe eine Schleife, die eigentlich noch mehr Zeug in den json-war aber nicht relevant für das problem, so habe ich entfernt, der Einfachheit halber..
  • Ich bin mir ziemlich sicher, dass der json-string wird nicht kodiert im Zeichensatz der Ihr html-Dokument erwartet wird.

InformationsquelleAutor RaphaelDDL | 2013-07-02
Schreibe einen Kommentar