2010-03-09 14 views
58

Ho questo oggetto JSON memorizzato su un file di testo:PHP json_decode() restituisce NULL con JSON valido?

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

Quando provo a decodificarlo con json_decode(), restituisce NULL. Perché? Il file è leggibile (ho provato echoing file_get_contents() e ha funzionato bene).

Ho provato JSON contro http://jsonlint.com/ ed è perfettamente valido.

Cosa c'è che non va qui?

Soluzione

Alla ricerca di risposte su Google, sono tornato a SO: json_decode returns NULL after webservice call. Il mio file JSON aveva la sequenza BOM UTF (alcuni caratteri binari che non dovrebbero essere lì), rompendo così la struttura JSON. Andato a Hex Editor, cancellato i byte. Tutto è tornato alla normalità. Perché è successo? Perché ho modificato il file utilizzando il Blocco note di Microsoft Windows. Idea terribile!

+2

Utilizzo di PHP 5.2.9; quindi, non posso usare 'json_last_error()'. –

+1

Nota anche che ciò può accadere con altri caratteri non validi nel mezzo del file. Ho appena avuto json_decode() restituendo null perché la stringa conteneva uno di quei trattini speciali, probabilmente incollati da MS Word, e quindi forse mis-encoded. Per identificare potenziali caratteri problema, apri il file JSON (che ho usato in Notepad ++), cambia la codifica (senza conversione) e salva come copia. Quindi diff i due file (ho usato WinMerge). – LinusR

+0

(problema Blocco note di Windows) Si prega di consultare questo, ho condiviso il problema e lo ha risolto: http://stackoverflow.com/questions/10290849/how-to-remove-multiple-utf-8-bom-sequences-before -doctype –

risposta

45

Potrebbe essere la codifica dei caratteri speciali. Potresti chiedere allo json_last_error() di ottenere informazioni certe.

Aggiornamento: il problema è risolto, consultare il paragrafo "Soluzione" nella domanda.

+0

Sto usando i caratteri speciali da quando ho avviato l'applicazione e non ci sono stati problemi prima. A livello locale, la decodifica JSON funziona perfettamente. Sul mio server, no. E non posso chiamare 'json_last_error()' perché è PHP 5.2.9. Quella funzione appare su PHP 5.3.0. –

+0

Sostituito i caratteri speciali con le entità HTML. Ancora lo stesso risultato. –

+0

@Joel aspetta, lo testerò su 5.3 –

19

Se si verifica la richiesta in chrome, si vedrà che il JSON è testo, quindi è stato aggiunto codice vuoto al JSON.

È possibile cancellarlo usando

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

Quindi è possibile utilizzare:

json_decode($k)

print_r mostrerà quindi la matrice.

+0

Mi hai salvato la vita !, buon inglese però;) –

+0

Grazie per questo - spero che trovi l'inglese mancante. –

+0

mi hai salvato la vita! –

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

ha fatto per me. E sì, test su Chrome. Grazie a user2254008

1

Come dichiarato da Jürgen Math utilizzando il metodo preg_replace elencato dall'utente2254008, l'ho risolto anche per me.

Questo non è limitato a Chrome, sembra essere un problema di conversione del set di caratteri (almeno nel mio caso, Unicode -> UTF8) Questo ha risolto tutti i problemi che stavo avendo.

Come nodo futuro, l'oggetto JSON I era in decodifica derivato dalla funzione json.dumps di Python. Questo a sua volta ha causato alcuni altri dati non sanitari per farlo attraversare anche se è stato facilmente affrontato.

-5
<?php 
$json_url = "http://api.testmagazine.com/test.php?type=menu"; 
$json = file_get_contents($json_url); 
$json=str_replace('}, 

]',"} 

]",$json); 
$data = json_decode($json); 

echo "<pre>"; 
print_r($data); 
echo "</pre>"; 
?> 
4

Ho solo pensato di aggiungere questo, mentre mi sono imbattuto in questo numero oggi. Se c'è una spaziatura attorno alla stringa JSON, json_decode restituirà NULL.

Se si sta tirando il JSON da una fonte diversa da una variabile PHP, sarebbe saggio a "tagliare" in primo luogo:

$jsonData = trim($jsonData); 
11

Ho avuto lo stesso problema e ho risolto semplicemente sostituendo il carattere preventivo prima della decodifica.

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

Il mio valore JSON è stato generato dalla funzione JSON.stringify.

+2

Questo mi ha aiutato a risolvere il mio problema! – Klaaz

40

questo ha lavorato per me

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

ha funzionato per me. grazie :) – webelizer

+2

Ho usato questo e ho ottenuto l'array ma sono stati cancellati anche i miei caratteri specifici della lingua (ş, ç, ö, ..). – zkanoca

+0

solo questo lavoro per me ... grazie –

1

Se hai trovato JSON dal database, messo

mysqli_set_charset($con, "utf8"); 

dopo aver definito collegamento di connessione $ con

+0

Grazie TomoMiha. Questo è esattamente ciò che si adatta a tutti i miei problemi con MySQL contenente caratteri speciali e quando convertito da json_decode, quel particolare campo è stato restituito = null .... – KLL

1

Basta risparmiare un po 'per volta. Ho impiegato 3 ore per scoprire che si trattava solo di un problema di codifica html. Prova questo

if(get_magic_quotes_gpc()){ 
    $param = stripslashes($row['your column name']); 
}else{ 
    $param = $row['your column name']; 
} 

$param = json_decode(html_entity_decode($param),true); 
$json_errors = array(
JSON_ERROR_NONE => 'No error has occurred', 
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', 
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', 
JSON_ERROR_SYNTAX => 'Syntax error', 
); 
echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL; 
print_r($param); 
6

Si potrebbe provare con esso.

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

Nessun altro ha funzionato con un enorme array. Grazie! –

7

Forse alcuni caratteri nascosti sono scherzi con la tua JSON, provate questo:

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

Ho risolto questo problema stampando il JSON, e poi controllando il sorgente della pagina (CTRL/CMD + U):

print_r(file_get_contents($url)); 

rivelò c'era un <pre> tag finale.

1

questo aiuterà a capire qual è il tipo di errore

<?php 
// A valid json string 
$json[] = '{"Organization": "PHP Documentation Team"}'; 

// An invalid json string which will cause an syntax 
// error, in this case we used ' instead of " for quotation 
$json[] = "{'Organization': 'PHP Documentation Team'}"; 


foreach ($json as $string) { 
    echo 'Decoding: ' . $string; 
    json_decode($string); 

    switch (json_last_error()) { 
     case JSON_ERROR_NONE: 
      echo ' - No errors'; 
     break; 
     case JSON_ERROR_DEPTH: 
      echo ' - Maximum stack depth exceeded'; 
     break; 
     case JSON_ERROR_STATE_MISMATCH: 
      echo ' - Underflow or the modes mismatch'; 
     break; 
     case JSON_ERROR_CTRL_CHAR: 
      echo ' - Unexpected control character found'; 
     break; 
     case JSON_ERROR_SYNTAX: 
      echo ' - Syntax error, malformed JSON'; 
     break; 
     case JSON_ERROR_UTF8: 
      echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; 
     break; 
     default: 
      echo ' - Unknown error'; 
     break; 
    } 

    echo PHP_EOL; 
} 
?> 
0

si dovrebbe garantire che questi punti

1. la stringa JSON non abbia alcuna incognite caratteri

2. json string può visualizzare dal visualizzatore online di json (puoi cercare su google come visualizzatore online o parser f o JSON) dovrebbe visualizzare senza alcun errore

3. la stringa non hanno entità HTML dovrebbe essere plain text/string

per la spiegazione del punto 3

$html_product_sizes_json=htmlentities($html); 
    $ProductSizesArr = json_decode($html_product_sizes_json,true); 

a (rimuovi la funzione htmlentities())

$html_product_sizes_json=$html; 
    $ProductSizesArr = json_decode($html_product_sizes_json,true); 
Problemi correlati