Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema al leer un JSON con PHP

Estas en el tema de Problema al leer un JSON con PHP en el foro de PHP en Foros del Web. Buenas a tod@s... Desde hace varios días vengo arrastrando un problema que no puedo solucionar por mi mismo. Tengo un archivo JSON con diferentes datos, ...
  #1 (permalink)  
Antiguo 25/04/2016, 20:44
 
Fecha de Ingreso: abril-2016
Mensajes: 30
Antigüedad: 8 años
Puntos: 2
Pregunta Problema al leer un JSON con PHP

Buenas a tod@s...
Desde hace varios días vengo arrastrando un problema que no puedo solucionar por mi mismo.
Tengo un archivo JSON con diferentes datos, quiero leerlos desde php y mostrarlos en una web. Hasta ahora, todo esto va bien.
La cuestión es que en el JSON, uno de los arrays, contiene dentro otro array y no puedo leerlo con PHP. Mejor dicho, no puedo hacer que PHP me lo muestre como array, sino que lo hace como string.
Adjunto algunas imágenes.

Vista previa del JSON. (Lo recuadrado en rojo es lo que quiero dividir y mostrar por separado)



Código PHP.
Código PHP:
<?php

$leer 
file_get_contents("data2.json");
$datos json_decode($leer,true);
 
for(
$i=0;$i<=38;$i++)

{

echo 
$datos["data"]["quests"][$i]["rewards"]."<br>";

}
Lo que se ve en pantalla. (Sólo una parte de todo lo que se muestra).

Cita:
{"coins":34800,"xp":2940,"honor":0,"premium":0,"st atPoints":0,"item":0}
{"coins":1640,"xp":971,"honor":0,"premium":0,"stat Points":0,"item":0}
{"coins":22200,"xp":525,"honor":0,"premium":0,"sta tPoints":0,"item":0}
{"coins":20700,"xp":1510,"honor":0,"premium":0,"st atPoints":0,"item":0}
{"coins":11100,"xp":975,"honor":0,"premium":0,"sta tPoints":0,"item":0}
Desde ya, les agradezco su atención.
Saludos.


  #2 (permalink)  
Antiguo 25/04/2016, 21:01
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
Respuesta: Problema al leer un JSON con PHP

Una opción seria hacer un json_decode a $datos["data"]["quests"][$i]["rewards"].

La segunda opción seria probando con aumentar la profundidad.
Código PHP:
Ver original
  1. json_decode($leer, true, 1024);//default 128 o 512 en versiones superiores a la 5.3
  #3 (permalink)  
Antiguo 25/04/2016, 21:18
 
Fecha de Ingreso: abril-2016
Mensajes: 30
Antigüedad: 8 años
Puntos: 2
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por Rodrhigo Ver Mensaje
Una opción seria hacer un json_decode a $datos["data"]["quests"][$i]["rewards"].

La segunda opción seria probando con aumentar la profundidad.
Código PHP:
Ver original
  1. json_decode($leer, true, 1024);//default 128 o 512 en versiones superiores a la 5.3
Gracias por la respuesta.

La primera opción no la entendí muy bien. De todas formas lo intenté, pero me dio este error.

Cita:
Warning: Illegal string offset 'data' in C:\xampp\htdocs\*****\json.php on line 4

Warning: Illegal string offset 'quests' in C:\xampp\htdocs\*****\json.php on line 4

Notice: Undefined variable: i in C:\xampp\htdocs\*****\json.php on line 4

Notice: String offset cast occurred in C:\xampp\htdocs\*****\json.php on line 4

Warning: Illegal string offset 'rewards' in C:\xampp\htdocs\*****\json.php on line 4
Y la segunda opción, no me funcionó. Me dio éste otro error.

Cita:
Warning: Illegal string offset 'xp' in C:\xampp\htdocs\*****\json.php on line 10
{
PD: Lo que quiero hacer es que a esto:

Cita:
{"coins":34800,"xp":2940,"honor":0,"premium":0,"st atPoints":0,"item":0}
Me lo trate por separado. Por ejemplo:

Cita:
coins: 34800
xp: 2940
honor: 0
premium: 0
statPoints: 0
item: 0
  #4 (permalink)  
Antiguo 25/04/2016, 21:34
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
Respuesta: Problema al leer un JSON con PHP

Hice una prueba con la primera opción y me lo imprimió correctamente;
Código PHP:
Ver original
  1. $json = json_decode('{"coins":34800,"xp":2940,"honor":0,"premium":0,"st atPoints":0,"item":0}');
  2. print_r($json);// imprime >>> [coins] => 34800 [xp] => 2940 [honor] => 0 [premium] => 0 [st atPoints] => 0 [item] => 0

Si dices que $datos["data"]["quests"][$i]["rewards"] retorna un string entonces lo puedes colocar en un arreglo Asociativo en formato Json, tu código quedaría así:

Código PHP:
Ver original
  1. $leer = file_get_contents("data2.json");
  2. $datos = json_decode($leer,true);
  3. $rewards = array();
  4.  
  5. for($i=0;$i<=38;$i++) {
  6. $json =json_decode($datos["data"]["quests"][$i]["rewards"],true);
  7. $rewards[] = $json;
  8. }
  9. print_r($rewards);//Deberia imprimir el arreglo de forma Asociativa.
  #5 (permalink)  
Antiguo 25/04/2016, 21:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema al leer un JSON con PHP

Yo lo que veo ridículo es que el JSON tenga otro JSON codificado como string y no como objeto, eso únicamente demuestra que quien creó el JSON no tenía ni idea de lo que estaba haciendo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 25/04/2016, 21:49
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
De acuerdo Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por pateketrueke Ver Mensaje
Yo lo que veo ridículo es que el JSON tenga otro JSON codificado como string y no como objeto, eso únicamente demuestra que quien creó el JSON no tenía ni idea de lo que estaba haciendo.
Me imagino que por un tema de memoria por eso el tercer parámetro($depth) permite definir la profundidad.

A mayor valor mayor es la cantidad de variables que se crean.
  #7 (permalink)  
Antiguo 25/04/2016, 21:56
 
Fecha de Ingreso: abril-2016
Mensajes: 30
Antigüedad: 8 años
Puntos: 2
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por Rodrhigo Ver Mensaje
Hice una prueba con la primera opción y me lo imprimió correctamente;
Código PHP:
Ver original
  1. $json = json_decode('{"coins":34800,"xp":2940,"honor":0,"premium":0,"st atPoints":0,"item":0}');
  2. print_r($json);// imprime >>> [coins] => 34800 [xp] => 2940 [honor] => 0 [premium] => 0 [st atPoints] => 0 [item] => 0

Si dices que $datos["data"]["quests"][$i]["rewards"] retorna un string entonces lo puedes colocar en un arreglo Asociativo en formato Json, tu código quedaría así:

Código PHP:
Ver original
  1. $leer = file_get_contents("data2.json");
  2. $datos = json_decode($leer,true);
  3. $rewards = array();
  4.  
  5. for($i=0;$i<=38;$i++) {
  6. $json =json_decode($datos["data"]["quests"][$i]["rewards"],true);
  7. $rewards[] = $json;
  8. }
  9. print_r($rewards);//Deberia imprimir el arreglo de forma Asociativa.
Gracias por la ayuda, pero no es eso lo que necesito.

Quiero que me lo muestre así. Pondré un ejemplo con el mismo archivo JSON, pero en vez de "quests", voy a elegir "items":

Vista previa del JSON:



Código PHP:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $leer = file_get_contents("data2.json");
  4. $data = json_decode($leer,true);
  5.  
  6. for($i=0;$i<=5;$i++){
  7.  
  8. echo $data["data"]["items"][$i]["id"]."<br>";
  9.  
  10. }

Lo que me muestra en la web (El ID de los 6 elementos del JSON en "items"):

Código:
40503590
40503591
40514902
40514903
40514963
40521330
Yo quiero que pase lo mismo con la opción "quests"... Que me muestre por separado: Coins, xp, honor, premium, item...
Ya que quiero asociar cada uno de estos, a una variable.
  #8 (permalink)  
Antiguo 25/04/2016, 21:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por Rodrhigo Ver Mensaje
Me imagino que por un tema de memoria por eso el tercer parámetro($depth) permite definir la profundidad.

A mayor valor mayor es la cantidad de variables que se crean.
Pues yo he manejado estructuras más complejas que esas y nunca he tenido problemas, de verdad me parece innecesaria dicha optimización.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 25/04/2016, 22:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por wil32 Ver Mensaje
Yo quiero que pase lo mismo con la opción "quests"... Que me muestre por separado: Coins, xp, honor, premium, item...
Ya que quiero asociar cada uno de estos, a una variable.
Muy fácil: sólo debes volver a parsear el JSON anidado con json_decode() (porque el valor es JSON como un string) y volver a hacer un loop, nada del otro mundo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 25/04/2016, 22:12
 
Fecha de Ingreso: abril-2016
Mensajes: 30
Antigüedad: 8 años
Puntos: 2
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por pateketrueke Ver Mensaje
Muy fácil: sólo debes volver a parsear el JSON anidado con json_decode() (porque el valor es JSON como un string) y volver a hacer un loop, nada del otro mundo.
Gracias por responder...
Hace poco que estoy con esto de JSON, asique no entendí mucho de lo que dijiste. xD
  #11 (permalink)  
Antiguo 25/04/2016, 22:18
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por wil32 Ver Mensaje
Gracias por responder...
Hace poco que estoy con esto de JSON, asique no entendí mucho de lo que dijiste. xD
Te hice un ejemplo(nuevamente) y como dice pateketrueke es solo agregar otro ciclo:
Código PHP:
Ver original
  1. $leer = file_get_contents("data2.json");
  2. $datos = json_decode($leer,true);
  3. $rewards = array();
  4.  
  5. for($i=0;$i<=38;$i++) {
  6.    $valor = $datos["data"]["quests"][$i]["rewards"];
  7. $json =json_decode($valor,true);
  8.  
  9. if(count($json =json_decode($valor))>0){
  10.    foreach($json as $nombre=> $valor){
  11.       echo "La variable $nombre tiene un valor de $valor<br>";
  12.    }
  13. }else{
  14.    echo $valor.'<br>';
  15. }
  #12 (permalink)  
Antiguo 25/04/2016, 22:38
 
Fecha de Ingreso: abril-2016
Mensajes: 30
Antigüedad: 8 años
Puntos: 2
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por Rodrhigo Ver Mensaje
Te hice un ejemplo(nuevamente) y como dice pateketrueke es solo agregar otro ciclo:
Código PHP:
Ver original
  1. $leer = file_get_contents("data2.json");
  2. $datos = json_decode($leer,true);
  3. $rewards = array();
  4.  
  5. for($i=0;$i<=38;$i++) {
  6.    $valor = $datos["data"]["quests"][$i]["rewards"];
  7. $json =json_decode($valor,true);
  8.  
  9. if(count($json =json_decode($valor))>0){
  10.    foreach($json as $nombre=> $valor){
  11.       echo "La variable $nombre tiene un valor de $valor<br>";
  12.    }
  13. }else{
  14.    echo $valor.'<br>';
  15. }
Gracias. Eso se acerca demasiado a lo que quiero lograr...
Ahora, si quisiera sólo mostrar los valores de "coins" y "xp" para almacenarlos en variables, ¿Qué debería hacer?
Ya que quiero guardar esos datos en una base de datos.

EDITO:
No logro entender por qué no puedo hacer esto:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $leer = file_get_contents("data2.json");
  4. $datos = json_decode($leer,true);
  5.  
  6. for($i=0;$i<=38;$i++)
  7.  
  8. {
  9.  
  10. echo $datos["data"]["quests"][$i]["rewards"]["xp"]."<br>";
  11.  
  12. }
Agregué ["xp"] al final del echo.

Última edición por wil32; 25/04/2016 a las 22:41 Razón: Actualización
  #13 (permalink)  
Antiguo 25/04/2016, 22:59
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
De acuerdo Respuesta: Problema al leer un JSON con PHP

Tampoco se porque $datos["data"]["quests"][$i]["rewards"] te imprime un string cuando debería estar en formato Json.

Prueba esto:
$datos = json_decode($leer,true,768);

Sino funciona cambia esto:
echo "La variable $nombre tiene un valor de $valor<br>";

por esto:
$datos["data"]["quests"][$i]["rewards"][$nombre] = $valor.


Y no tendrías que asignar a ninguna variable más porque ya estarían en una variable..

Para insertar en una base de datos tendrías que abrir un hilo nuevo especificando la BD o buscar por internet que hay muchos ejemplos y como te digo las variables ya la tienes
($datos["data"]["quests"][XXXXXX]["rewards"]["coin"]) es solo insertar.

Eso, hasta aquí llego. Saludos
  #14 (permalink)  
Antiguo 26/04/2016, 01:14
 
Fecha de Ingreso: abril-2016
Mensajes: 30
Antigüedad: 8 años
Puntos: 2
Respuesta: Problema al leer un JSON con PHP

Cita:
Iniciado por Rodrhigo Ver Mensaje
Tampoco se porque $datos["data"]["quests"][$i]["rewards"] te imprime un string cuando debería estar en formato Json.

Prueba esto:
$datos = json_decode($leer,true,768);

Sino funciona cambia esto:
echo "La variable $nombre tiene un valor de $valor<br>";

por esto:
$datos["data"]["quests"][$i]["rewards"][$nombre] = $valor.


Y no tendrías que asignar a ninguna variable más porque ya estarían en una variable..

Para insertar en una base de datos tendrías que abrir un hilo nuevo especificando la BD o buscar por internet que hay muchos ejemplos y como te digo las variables ya la tienes
($datos["data"]["quests"][XXXXXX]["rewards"]["coin"]) es solo insertar.

Eso, hasta aquí llego. Saludos
Hice lo que dijiste, pero no funcionó. De todas formas seguí de forma constante estudiando el código y por fin logré lo que quería. La solución fue esta:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $leer = file_get_contents("data2.json");
  4. $datos = json_decode($leer,true);
  5.  
  6. for($i=0;$i<=38;$i++)
  7.  
  8. {
  9.  
  10. $rewards = $datos["data"]["quests"][$i]["rewards"];
  11. $datos2 = json_decode($rewards,true);
  12.  
  13. echo $datos2["coins"]."<br>";
  14.  
  15. }

De esa forma pude obtener los datos que quería. Asique, una vez ese paso dado, me puse a almacenar los datos en variables.

Código PHP:
Ver original
  1. $xp = $datos2["xp"];
  2. $mon = $datos2["coins"];

Ya lo que hice a continuación, no es relevante para el tema.

Muchas gracias por vuestra ayuda. *-*

Etiquetas: arrays, json, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:27.