PHP json_decode() gibt NULL mit scheinbar gültigem JSON zurück?

Lesezeit: 5 Minuten

Benutzeravatar von Joel A. Villarreal Bertoldi
Joel A. Villarreal Bertoldi

Ich habe dieses JSON-Objekt in einer einfachen Textdatei gespeichert:

{
    "MySQL": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "DatabaseName": "(dbname)"
    },
    "Ftp": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "RootFolder": "(rf)"
    },
    "BasePath": "../../bin/",
    "NotesAppPath": "notas",
    "SearchAppPath": "buscar",
    "BaseUrl": "http:\/\/montemaiztusitio.com.ar",
    "InitialExtensions": [
        "nem.mysqlhandler",
        "nem.string",
        "nem.colour",
        "nem.filesystem",
        "nem.rss",
        "nem.date",
        "nem.template",
        "nem.media",
        "nem.measuring",
        "nem.weather",
        "nem.currency"
    ],
    "MediaPath": "media",
    "MediaGalleriesTable": "journal_media_galleries",
    "MediaTable": "journal_media",
    "Journal": {
        "AllowedAdFileFormats": [
            "flv:1",
            "jpg:2",
            "gif:3",
            "png:4",
            "swf:5"
        ],
        "AdColumnId": "3",
        "RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
        "FrontendLayout": "Flat",
        "AdPath": "ad",
        "SiteTitle": "Monte Maíz: Tu Sitio",
        "GlobalSiteDescription": "Periódico local de Monte Maíz.",
        "MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.",
        "TemplatePath": "templates",
        "WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ",
        "WeatherMeasureType": "1",
        "CurrencySource": "cotizacion-monedas:Dolar|Euro|Real",
        "TimesSingular": "vez",
        "TimesPlural": "veces"
    }
}

Wenn ich versuche, es mit zu dekodieren json_decode(), es gibt NULL zurück. Wieso den? Die Datei ist lesbar (ich habe versucht echoing file_get_contents() und es hat geklappt).

Ich habe JSON gegen getestet http://jsonlint.com/ und es ist vollkommen gültig.

Was ist hier falsch?

  • Arbeiten mit PHP 5.2.9; daher kann ich nicht verwenden json_last_error().

    – Joel A. Villarreal Bertoldi

    9. März 2010 um 15:57 Uhr

  • Beachten Sie auch, dass dies bei anderen ungültigen Zeichen in der Mitte der Datei passieren kann. Ich hatte gerade json_decode(), das null zurückgab, weil die Zeichenfolge einen dieser speziellen Bindestriche enthielt, die wahrscheinlich aus MS Word eingefügt und dann möglicherweise falsch codiert wurden. Um potenziell problematische Zeichen zu identifizieren, öffnen Sie die JSON-Datei (die ich in Notepad++ verwendet habe), ändern Sie die Kodierung (ohne sie zu konvertieren) und speichern Sie sie als Kopie. Vergleichen Sie dann die beiden Dateien (ich habe WinMerge verwendet).

    – LinusR

    17. Januar 2012 um 17:15 Uhr


  • (Windows Notepad-Problem) Bitte konsultieren Sie dies, ich habe das Problem auch geteilt und es wurde behoben: stackoverflow.com/questions/10290849/…

    – Felix Aballi

    19. September 2014 um 14:49 Uhr

  • Ein mögliches Duplikat von json_decode gibt nach dem Webservice-Aufruf NULL zurück

    – Benutzer

    3. Dezember 2014 um 18:17 Uhr

  • Für mich war es nichts Besonderes, nur ein zusätzliches Komma am Ende eines Objektelements. Fazit: Alles, was Ihr JSON inkonsistent macht, wird einen Fehler auslösen. Bonus-Tipp: Vertrauen Sie jsonviewer.stack.hu nicht Verwenden Sie so etwas wie jsonlint

    – Aman Alam

    24. Oktober 2016 um 11:30 Uhr

Das hat bei mir funktioniert

json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true );

  • Ich habe dies verwendet und das Array erhalten, aber meine sprachspezifischen Zeichen (ş,ç,ö,..) wurden ebenfalls gelöscht.

    – zkanoca

    17. Dezember 2014 um 10:56 Uhr

  • Dies ist nicht korrekt, wenn die JSON-Daten UTF-8-codiert sind (oder eine andere UTF-Codierung, denke ich). Es entfernt gültige UTF-8-codierte Daten. Es wird wahrscheinlich funktionieren, solange die Datei nur englische Sprache enthält, aber das ist immer eine riskante Annahme. Ich würde das nicht verwenden.

    – DaedalusAlpha

    13. Oktober 2015 um 15:28 Uhr

  • Damit funktioniert es, aber ohne nicht, obwohl die beiden Saiten identisch sind, übersehe ich etwas?

    – Rudie Visser

    25. August 2016 um 10:03 Uhr


  • es funktioniert! aber wieso? Die Zeichenfolge, die ich zu dekodieren versuchte, enthielt keine Sonderzeichen

    – Tobias Gassmann

    3. Oktober 2017 um 13:19 Uhr


Benutzeravatar von Pekka
Pekka

Es könnte die Kodierung der Sonderzeichen sein. Du könntest fragen json_last_error() um konkrete Informationen zu erhalten.

  • Ich benutze die Sonderzeichen, seit ich die Anwendung gestartet habe, und es gab vorher keine Probleme. Lokal funktioniert die JSON-Decodierung einwandfrei. Auf meinem Server nicht. Und ich kann nicht anrufen json_last_error() weil es PHP 5.2.9 ist. Diese Funktion erscheint auf PHP 5.3.0.

    – Joel A. Villarreal Bertoldi

    9. März 2010 um 15:54 Uhr

  • Nö, das sollte funktionieren. Ich kann im Moment nicht mehr testen, wenn ich später dazu komme, werde ich es hier posten. Es gibt auch ein paar Hinweise in den von Benutzern beigesteuerten Notizen: de.php.net/json_decode vielleicht hilft was.

    – Pekka

    9. März 2010 um 16:09 Uhr


  • Für mich funktioniert es unter PHP 5.3 gut, wenn der Text in UTF-8 codiert ist. Aber wenn ich den Text durchgebe utf8_decode() Zuerst, dann json_decode() stillschweigend scheitert.

    – Matthew

    9. März 2010 um 16:15 Uhr

  • @Pekka Auf der Suche nach Antworten bei Google kam ich zurück zu SO: stackoverflow.com/questions/689185/json-decode-returns-null-php. Meine JSON-Datei hatte die UTF-BOM-Sequenz (einige Binärzeichen, die nicht vorhanden sein sollten), wodurch die JSON-Struktur gebrochen wurde. Ging zum Hex-Editor, löschte die Bytes. Alles ist wieder normal. Warum ist das passiert? Weil ich die Datei mit dem Notepad von Microsoft Windows bearbeitet habe. Schreckliche Vorstellung!

    – Joel A. Villarreal Bertoldi

    9. März 2010 um 17:59 Uhr

  • Dies sollte den PHP-Leuten als Fehler gemeldet werden. Wenn die Stückliste gültiges UTF8 war, sollte sie nicht stillschweigend daran ersticken.

    – Jmucchiello

    9. März 2010 um 18:34 Uhr

Du könntest es damit versuchen.

json_decode(stripslashes($_POST['data']))

Benutzeravatar von user2254008
Benutzer2254008

Wenn Sie die Anfrage in Chrome überprüfen, werden Sie sehen, dass der JSON Text ist, also wurde dem JSON ein leerer Code hinzugefügt.

Sie können es löschen, indem Sie verwenden

$k=preg_replace('/\s+/', '',$k);

Dann können Sie verwenden:

json_decode($k)

print_r zeigt dann das Array.

Vielleicht verwirren einige versteckte Zeichen Ihren Json, versuchen Sie Folgendes:

$json = utf8_encode($yourString);
$data = json_decode($json);

Benutzeravatar von Charles Yapp
Karl Yapp

Ich hatte das gleiche Problem und habe es einfach gelöst, indem ich das Anführungszeichen vor der Dekodierung ersetzt habe.

$json = str_replace('"', '"', $json);
$object = json_decode($json);

Mein JSON-Wert wurde von der JSON.stringify-Funktion generiert.

Für mich funktioniert die PHP-Funktion striplashes () beim Empfang von json von Javascript. Beim Empfang von json von Python macht der zweite optionale Parameter des json_decode-Aufrufs den Trick, da das Array assoziativ ist. Funktioniert bei mir wie ein Zauber.

$json = stripslashes($json); //add this line if json from javascript
$edit = json_decode($json, true); //adding parameter true if json from python

1434260cookie-checkPHP json_decode() gibt NULL mit scheinbar gültigem JSON zurück?

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

Privacy policy