working validate not json_last_error json_error_syntax json_decode funciona empty php json null

validate - return json php



PHP json_decode() devuelve NULL con JSON vĂ¡lido? (16)

Tengo este objeto JSON almacenado en un archivo de texto sin formato:

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

Cuando intento decodificarlo con json_decode() , devuelve NULL. ¿Por qué? El archivo es legible (intenté hacer eco de file_get_contents() y funcionó bien).

Probé JSON contra http://jsonlint.com/ y es perfectamente válido.

¿Qué pasa aquí?

Solución

Buscando respuestas en Google, volví a SO: json_decode devuelve NULL después de la llamada al servicio web . Mi archivo JSON tenía la secuencia BOM UTF (algunos caracteres binarios que no deberían estar allí), rompiendo así la estructura JSON. Fui al Editor de Hex, borré los bytes. Todo ha vuelto a la normalidad ¿Por qué ha sucedido esto? Porque edité el archivo usando el Bloc de notas de Microsoft Windows. ¡Terrible idea!


Aquí puede encontrar un pequeño contenedor JSON con acciones correctivas que abordan el problema BOM y no ASCI: https://.com/a/43694325/2254935


Como lo afirma Jürgen Math, el método preg_replace que listó user2254008 también lo solucionó.

Esto no está limitado a Chrome, parece ser un problema de conversión de juego de caracteres (al menos en mi caso, Unicode -> UTF8) Esto solucionó todos los problemas que estaba teniendo.

Como un nodo futuro, el objeto JSON que estaba decodificando proviene de la función json.dumps de Python. Esto, a su vez, causó que otros datos insalubres lo cruzaran, aunque fue fácil de tratar.


Esto funcionó para mí

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


He resuelto este problema imprimiendo el JSON y luego comprobando el origen de la página (CTRL / CMD + U):

print_r(file_get_contents($url));

Resultó que había una etiqueta <pre> final.


Podría ser la codificación de los caracteres especiales. Puede solicitar json_last_error() para obtener información definitiva.

Actualización: el problema está resuelto, consulte el párrafo "Solución" en la pregunta.


Podrías probar con eso.

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


Si marca la solicitud en chrome, verá que el JSON es texto, por lo que se ha agregado un código en blanco al JSON.

Puedes borrarlo usando

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

Entonces puedes usar:

json_decode($k)

print_r mostrará la matriz.


Si obtiene json de la base de datos, ponga

mysqli_set_charset($con, "utf8");

después de definir el enlace de conexión $ con


Solo ahorre un tiempo. Pasé 3 horas para descubrir que solo era un problema de codificación html. Prueba esto

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


Solo pensé que agregaría esto, ya que me encontré con este tema hoy. Si hay un relleno de cadena alrededor de su cadena JSON, json_decode devolverá NULL.

Si extrae el JSON de una fuente que no sea una variable de PHP, sería conveniente "recortarlo" primero:

$jsonData = trim($jsonData);


Tal vez algunos personajes ocultos están jugando con su JSON, intente esto:

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


Tuve el mismo problema y lo resolví simplemente reemplazando el carácter de cita antes de decodificar.

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

Mi valor JSON fue generado por la función JSON.stringify.


esto te ayuda a entender cuál es el tipo de error

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


deberías asegurarte estos puntos

1. tu json string no tiene ningún personaje desconocido

2. cadena json puede ver desde el visor json en línea (puede buscar en google como visor en línea o analizador para json) debe ver sin ningún error

3. tu cadena no tiene entidades html, debería ser texto plano / cadena

para la explicación del punto 3

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

para (eliminar la función htmlentities ())

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


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

lo hizo por mí. Y sí, probando en Chrome. Thx a usuario2254008


<?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>"; ?>