working not json_decode php json

php - not - json_decode devuelve NULL después de la llamada al servicio web



json_decode not working (20)

Hay un comportamiento extraño con json_encode y json_decode y no puedo encontrar una solución:

Mi aplicación php llama a un servicio web php. El servicio web devuelve json que se ve así:

var_dump($foo): string(62) "{"action":"set","user":"123123123123","status":"OK"}"

ahora me gusta decodificar el json en mi aplicación:

$data = json_decode($foo, true)

pero devuelve NULL :

var_dump($data): NULL

Yo uso php5. El tipo de contenido de la respuesta del servicio web: "text/html; charset=utf-8" (también se intentó usar "application/json; charset=utf-8" )

¿Cuál podría ser la razón?


Acabo de poner esto

$result = mb_convert_encoding($result,''UTF-8'',''UTF-8''); $result = json_decode($result);

y está funcionando


Ayer pasé 2 horas revisando y solucionando ese error, finalmente encontré que en la cadena JSON que quería decodificar había ''/' slashes. Entonces, lo más lógico es usar la función stripslashes o algo similar a PL diferente.

Por supuesto, la mejor manera es imprimir esta var y ver qué pasa después de json_decode, si es nula, también puedes usar la función json_last_error() para determinar el error que devolverá el entero, pero aquí están las int descritas:

0 = JSON_ERROR_NONE

1 = JSON_ERROR_DEPTH

2 = JSON_ERROR_STATE_MISMATCH

3 = JSON_ERROR_CTRL_CHAR

4 = JSON_ERROR_SYNTAX

5 = JSON_ERROR_UTF8

En mi caso obtuve la salida de json_last_error () como número 4, por lo que es JSON_ERROR_SYNTAX . Luego fui y eché un vistazo a la cadena que quería convertir y tenía en la última línea:

''/'title/' error ...''

Después de eso es realmente una solución fácil.

$json = json_decode(stripslashes($response)); if (json_last_error() == 0) { // you''ve got an object in $json}


Bueno, tuve un problema similar y los problemas fueron las citas mágicas de PHP en el servidor ... esta es mi solución:

if(get_magic_quotes_gpc()){ $param = stripslashes($_POST[''param'']); }else{ $param = $_POST[''param'']; } $param = json_decode($param,true);


Deberías probar json_last_error_msg() . Le dará el mensaje de error y le dirá qué está mal. Fue introducido en PHP 5.5.

$foo = "{"action":"set","user":"123123123123","status":"OK"}"; $data = json_decode($foo, true); if($data == null) { throw new Exception(''Decoding JSON failed with the following message: '' . json_last_error_msg()); } // ... JSON decode was good => Let''s use the data


En Notepad ++, seleccione Codificación (en el menú superior) y luego asegúrese de que esté seleccionado "Codificar en UTF-8".

Esto mostrará los caracteres que no deberían estar en tu JSON que causarían que json_decode fallara.


Estaba teniendo este problema, cuando estaba llamando a un método de jabón para obtener mis datos, y luego devolvió una cadena json, cuando traté de hacer json_decode, sigo obteniendo nulo.

Como estaba usando nusoap para hacer la llamada jazmín, traté de simplemente devolver json string y ahora podía hacer un json_decode, ya que realmente necesitaba obtener mis datos con una llamada SOAP, lo que hice fue agregar ob_start () antes de incluir nusoap, id hice mi llamada a la cadena genereate json, y luego antes de devolver mi json string hice ob_end_clean (), y OBTUVE MI PROBLEMA FIJO :)

EJEMPLO

//HRT - SIGNED //20130116 //verifica se um num assoc deco é valido ob_start(); require(''/nusoap.php''); $aResponse[''SimpleIsMemberResult''][''IsMember''] = FALSE; if(!empty($iNumAssociadoTmp)) { try { $client = new soapclientNusoap(PartnerService.svc?wsdl'', array( // OPTS ''trace'' => 0, ''exceptions'' => false, ''cache_wsdl'' => WSDL_CACHE_NONE ) ); //MENSAGEM A ENVIAR $sMensagem1 = '' <SimpleIsMember> <request> <CheckDigit>''.$iCheckDigitAssociado.''</CheckDigit> <Country>Portugal</Country> <MemberNumber">''.$iNumAssociadoDeco.''</MemberNumber> </request> </SimpleIsMember>''; $aResponse = $client->call(''SimpleIsMember'',$sMensagem1); $aData = array(''dados''=>$aResponse->xpto, ''success''=>$aResponse->example); } } ob_end_clean(); return json_encode($aData);


Imprima el último error json al depurar.

json_decode( $so, true, 9 ); $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; También use la función json.stringify () para verificar dos veces su sintaxis JSON.


Intenta usar json_encode en la cadena antes de usar json_decode ... idk si funciona para ti, pero lo hizo para mí ... Estoy usando laravel 4 ajaxing a través de un param de ruta.

$username = "{username: john}"; public function getAjaxSearchName($username) { $username = json_encode($username); die(var_dump(json_decode($username, true))); }


Ninguna de estas soluciones funcionó para mí. Lo que DID finalmente funcionó fue verificar la codificación de cadena guardándola en un archivo local y abriéndola con Notepad ++. Descubrí que era ''UTF-16'', así que pude convertirlo de esta manera:

$str = mb_convert_encoding($str,''UTF-8'',''UTF-16'');


Ninguna de las soluciones anteriores funcionó para mí, pero html_entity_decode($json_string) hizo el truco


No sé por qué? Pero este trabajo:

$out = curl_exec($curl); $out = utf8_encode($out); $out = str_replace("?", "", $out); if (substr($out,1,1)!=''{''){ $out = substr($out,3); } $arResult["questions"] = json_decode($out,true);

sin utf8_encode () - No trabaje


Prueba esto

$foo = utf8_encode($foo); $data = json_decode($foo, true);


Tal vez use algo como $ ${ : estos caracteres deben ser citados.


Tuve el problema similar en un sitio en vivo. En mi sitio local, funcionaba bien. Para arreglar lo mismo, acabo de agregar el siguiente código

json_decode(stripslashes($_GET[''arr'']));


Tuve un problema con el almacenamiento json-string en MySQL. Realmente no sé por qué, pero usando htmlspecialchars_decode berofe problema resuelto json_decode.


Tuve un problema similar, lo puse a funcionar después de agregar '''' (comillas simples) alrededor de la cadena json_encode. A continuación de mi archivo js:

var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING var myJsVar = ''<?php echo json_encode($var); ?>'' ; -------> WORKING

Solo pensé en publicarlo en caso de que alguien se tropiece con esta publicación como yo :)


Verifica la codificación de tu archivo. Estaba usando netbeans y tuve que usar la codificación iso windows 1252 para un proyecto anterior y netbeans estaba usando esta codificación desde entonces para cada nuevo archivo. json_decode luego devolverá NULL. Guardar el archivo de nuevo con codificación UTF-8 me solucionó el problema.


asegúrese de que si envió los datos por POST / GET, el servidor no ha escapado de las comillas

$my_array = json_decode(str_replace (''/"'',''"'', $json_string), true);


EDITAR: Acabo de hacer una inspección rápida de la cadena proporcionada por el OP. El pequeño "carácter" delante de la llave es un UTF-8 B (yte) O (rder) M (arca) 0xEF 0xBB 0xBF . No sé por qué esta secuencia de bytes se muestra aquí.

Esencialmente, el sistema del que se obtienen los datos los envía codificados en UTF-8 con una lista de materiales antes de los datos. Debe eliminar los primeros tres bytes de la cadena antes de lanzarlos a json_decode() (lo json_decode() un substr($string, 3) ).

string(62) "{"action":"set","user":"123123123123","status":"OK"}" ^ | This is the UTF-8 BOM

Como Kuroki Kaze descubrió, este personaje seguramente es la razón por la cual json_decode falla. La cadena en su forma dada no es correctamente una estructura formateada JSON (ver RFC 4627 )


"{"action":"set","user":"123123123123","status":"OK"}"

Este pequeño apóstrofo al principio, ¿qué es? Primer símbolo después de la doble cita.