Foros del Web » Programando para Internet » Javascript »

duda JSON

Estas en el tema de duda JSON en el foro de Javascript en Foros del Web. No se si este sera el foro apropiado para hablar de JSON, pero no encontre asi ninguna seccion especifica. Mi problema es que tengo un ...
  #1 (permalink)  
Antiguo 23/04/2010, 05:28
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
duda JSON

No se si este sera el foro apropiado para hablar de JSON, pero no encontre asi ninguna seccion especifica.

Mi problema es que tengo un web service que codifica la respuesta a enviar al cliente en JSON y despues la devuelve mediante un echo.

Cuando el cliente recibe la respuesta guarda en una variable el objeto JSON, pero al decodificarlo no sale nada. Voy a adjuntaros parte del codigo para orientaros un poco:

La utlima parte del servicio web, en el cual se forma la respuesta y se codifica es la siguiente:

Código PHP:
$respuesta=array('Status'=>$errores,'Features'=>$datos'Found'=>$num'Bounds'=>$posicion);
header('Content-type: text/json; charset=iso-8859-1');
echo 
json_encode($respuesta); 
El cliente usa una sesion CURL para establecer una comunicacion con el servicio web (pero eso creo que no es importante), recibe la respuesta y la intenta decodificar, momento en el que todo sale mal:

Código PHP:
$respuesta curl_exec($ch);
echo 
json_decode($respuesta); 
He probado algunas cosas como por ejemplo hacer un echo al array $respuesta en el servicio web, codificarlo, hacer un echo con el codificado y por ultimo decodificarlo y hacer otro echo. En los tres casos salio por pantalla lo que tenia que salir, el problema esta al enviar la informacion al cliente, es como si algo se modificase que impide al json_decode identificar la $respuesta como un objeto JSON

Sabres que estaré haciendo mal??

Muchas gracias y saludos
  #2 (permalink)  
Antiguo 23/04/2010, 08:27
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: duda JSON

Creo (es lo más probable aunque puede ser otra cosa) que el error pasa porque estás intentando mostrar un json_decode con un echo. La salida de un json_decode es normalmente un objeto stdClass, que no tiene por defecto un método __toString, de manera que un echo no tiene sentido. Podrías ver su contenido, para luego plantear la mejor manera de recuperar los resultados, usando var_dump o print_r.
  #3 (permalink)  
Antiguo 24/04/2010, 14:56
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda JSON

Buenas

Tienes razon con que al usar el print_r si te muestra el valor de la decodificacion. Pero solo de las que estan bien hechas por lo que. Aqui os muestro los resultados antes y despues de decodificar un objeto devuelto por un servicio web de Cloud made:

Decoding: {"version":0.3,"status":0,"route_summary":{"total_ distance":1603,"total_time":158,"start_point":"Sä gerstraße","end_point":"Im Gisinger Feld"},"route_geometry":[[47.25946,9.58395],[47.259239,9.58449],[47.258469,9.58625],[47.25769,9.58806],[47.258148,9.58849],[47.258991,9.58929],[47.259319,9.58957],[47.259548,9.5898],[47.259708,9.5901],[47.259789,9.59034],[47.259861,9.59071],[47.259918,9.59088],[47.259769,9.59246],[47.259708,9.59299],[47.259701,9.59367],[47.259682,9.59403],[47.259651,9.59418],[47.25938,9.595],[47.259201,9.59556],[47.259171,9.59569],[47.25914,9.59585],[47.259102,9.59682],[47.259102,9.59689],[47.258991,9.59737],[47.25898,9.59743],[47.258862,9.59792],[47.258709,9.59839],[47.25869,9.59847],[47.258808,9.59861],[47.258881,9.59878],[47.25893,9.59878],[47.25922,9.5988],[47.259548,9.59889],[47.25988,9.59897],[47.26001,9.59902],[47.260201,9.59911],[47.260429,9.59921],[47.260761,9.59938],[47.261009,9.59879]],"route_instructions": [["Head southeast on Sägerstraße",369,0,44,"0.4 km","SE",122.1],["Turn left at L60\/Nofler Straße",491,3,25,"0.5 km","NE",32.6,"TL",270.3],["Slight right at Hauptstraße",721,11,43,"0.7 km","E",98.0,"TSLR",27.5],["Slight left at Runastraße",237,29,57,"0.2 km","N",2.8,"TSLL",315.5],["Turn left at Im Gisinger Feld",53,37,6,"53 m","NW",301.6,"TL",282.3]]}


stdClass Object ( [version] => 0.3 [status] => 0 [route_summary] => stdClass Object ( [total_distance] => 1603 [total_time] => 158 [start_point] => Sägerstraße [end_point] => Im Gisinger Feld ) [route_geometry] => Array ( [0] => Array ( [0] => 47.25946 [1] => 9.58395 ) [1] => Array ( [0] => 47.259239 [1] => 9.58449 ) [2] => Array ( [0] => 47.258469 [1] => 9.58625 ) [3] => Array ( [0] => 47.25769 [1] => 9.58806 ) [4] => Array ( [0] => 47.258148 [1] => 9.58849 ) [5] => Array ( [0] => 47.258991 [1] => 9.58929 ) [6] => Array ( [0] => 47.259319 [1] => 9.58957 ) [7] => Array ( [0] => 47.259548 [1] => 9.5898 ) [8] => Array ( [0] => 47.259708 [1] => 9.5901 ) [9] => Array ( [0] => 47.259789 [1] => 9.59034 ) [10] => Array ( [0] => 47.259861 [1] => 9.59071 ) [11] => Array ( [0] => 47.259918 [1] => 9.59088 ) [12] => Array ( [0] => 47.259769 [1] => 9.59246 ) [13] => Array ( [0] => 47.259708 [1] => 9.59299 ) [14] => Array ( [0] => 47.259701 [1] => 9.59367 ) [15] => Array ( [0] => 47.259682 [1] => 9.59403 ) [16] => Array ( [0] => 47.259651 [1] => 9.59418 ) [17] => Array ( [0] => 47.25938 [1] => 9.595 ) [18] => Array ( [0] => 47.259201 [1] => 9.59556 ) [19] => Array ( [0] => 47.259171 [1] => 9.59569 ) [20] => Array ( [0] => 47.25914 [1] => 9.59585 ) [21] => Array ( [0] => 47.259102 [1] => 9.59682 ) [22] => Array ( [0] => 47.259102 [1] => 9.59689 ) [23] => Array ( [0] => 47.258991 [1] => 9.59737 ) [24] => Array ( [0] => 47.25898 [1] => 9.59743 ) [25] => Array ( [0] => 47.258862 [1] => 9.59792 ) [26] => Array ( [0] => 47.258709 [1] => 9.59839 ) [27] => Array ( [0] => 47.25869 [1] => 9.59847 ) [28] => Array ( [0] => 47.258808 [1] => 9.59861 ) [29] => Array ( [0] => 47.258881 [1] => 9.59878 ) [30] => Array ( [0] => 47.25893 [1] => 9.59878 ) [31] => Array ( [0] => 47.25922 [1] => 9.5988 ) [32] => Array ( [0] => 47.259548 [1] => 9.59889 ) [33] => Array ( [0] => 47.25988 [1] => 9.59897 ) [34] => Array ( [0] => 47.26001 [1] => 9.59902 ) [35] => Array ( [0] => 47.260201 [1] => 9.59911 ) [36] => Array ( [0] => 47.260429 [1] => 9.59921 ) [37] => Array ( [0] => 47.260761 [1] => 9.59938 ) [38] => Array ( [0] => 47.261009 [1] => 9.59879 ) ) [route_instructions] => Array ( [0] => Array ( [0] => Head southeast on Sägerstraße [1] => 369 [2] => 0 [3] => 44 [4] => 0.4 km [5] => SE [6] => 122.1 ) [1] => Array ( [0] => Turn left at L60/Nofler Straße [1] => 491 [2] => 3 [3] => 25 [4] => 0.5 km [5] => NE [6] => 32.6 [7] => TL [8] => 270.3 ) [2] => Array ( [0] => Slight right at Hauptstraße [1] => 721 [2] => 11 [3] => 43 [4] => 0.7 km [5] => E [6] => 98 [7] => TSLR [8] => 27.5 ) [3] => Array ( [0] => Slight left at Runastraße [1] => 237 [2] => 29 [3] => 57 [4] => 0.2 km [5] => N [6] => 2.8 [7] => TSLL [8] => 315.5 ) [4] => Array ( [0] => Turn left at Im Gisinger Feld [1] => 53 [2] => 37 [3] => 6 [4] => 53 m [5] => NW [6] => 301.6 [7] => TL [8] => 282.3 ) ) )

Ahora pongo el objeto que envia el servicio web que yo estoy creando:

Decoding: {"Status":"todo bien","Features":[{"coordinates":{"Longitud":"-5.64246","Latitud":"43.5348"},"properties":{"Nombr e":"El buen paladar","Direccion":null,"Distancia":4873252,"Des cripcion":"Se trata de un lugar especializado en las chuletas"}},{"coordinates":{"Longitud":"-5.65191","Latitud":"43.5391"},"properties":{"Nombr e":"la sardina saltarina","Direccion":null,"Distancia":4873833,"D escripcion":"establecimiento especializado en los manjares del mar"}},{"coordinates":{"Longitud":"-5.65145","Latitud":"43.5399"},"properties":{"Nombr e":"pizza movil","Direccion":null,"Distancia":4873916,"Descr ipcion":"pizzeria asquerosa pero barata"}},{"coordinates":{"Longitud":"-5.65337","Latitud":"43.5349"},"properties":{"Nombr e":"la tabernona","Direccion":null,"Distancia":4873388,"D escripcion":"especializada en las mejores cervezas"}},{"coordinates":{"Longitud":"-5.66601","Latitud":"43.5221"},"properties":{"Nombr e":"Zapico","Direccion":null,"Distancia":4872124," Descripcion":null}},{"coordinates":{"Longitud":"-5.64869","Latitud":"43.5368"},"properties":{"Nombr e":"Bahia","Direccion":null,"Distancia":4873543,"D escripcion":"hotel con vistas a la playa"}}],"Found":6,"Bounds":{"Limite norte":"43.54000","Limite sur":"43.48677","Limite este":"-5.69771","Limite oeste":"-5.60898"}}

Desgraciadamente no os puedo mostrar el objeto decodificado, porque no sale nada. Lo que me hace pensar que el cliente esta bien. El problema lo estoy teniendo al codificar el objeto en el servicio web.

Estuve mirando informacion por ahi y habia gente que tenia problemas con el tema de los acentos y demas. Pero yo creo k no tengo ningun acento en mi objeto ni caracteres extraños.

¿Se os ocurre que otra cosa puede estar fallando?

Saludos y muchas gracias a todos
  #4 (permalink)  
Antiguo 24/04/2010, 16:23
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: duda JSON

Yo no tuve problemas ni con esto:
Código PHP:
<script>
var 
a={"Status":"todo bien",
"Features":[
            {
"coordinates":{"Longitud":"-5.64246","Latitud":"43.5348"},
            
"properties":{"Nombr e":"El buen paladar","Direccion":null,"Distancia":4873252,"Des cripcion":"Se trata de un lugar especializado en las chuletas"}
            },
            {
"coordinates":{"Longitud":"-5.65191","Latitud":"43.5391"},
            
"properties":{"Nombr e":"la sardina saltarina","Direccion":null,"Distancia":4873833,"D escripcion":"establecimiento especializado en los manjares del mar"}
            },
            {
"coordinates":{"Longitud":"-5.65145","Latitud":"43.5399"},"properties":{"Nombr e":"pizza movil","Direccion":null,"Distancia":4873916,"Descr ipcion":"pizzeria asquerosa pero barata"}
            },
            {
"coordinates":{"Longitud":"-5.65337","Latitud":"43.5349"},"properties":{"Nombr e":"la tabernona","Direccion":null,"Distancia":4873388,"D escripcion":"especializada en las mejores cervezas"}
            },
            {
"coordinates":{"Longitud":"-5.66601","Latitud":"43.5221"},
            
"properties":{"Nombr e":"Zapico","Direccion":null,"Distancia":4872124," Descripcion":null}
            },
            {
"coordinates":{"Longitud":"-5.64869","Latitud":"43.5368"},
            
"properties":{"Nombr e":"Bahia","Direccion":null,"Distancia":4873543,"D escripcion":"hotel con vistas a la playa"}
            }],
            
"Found":6,"Bounds":{"Limite norte":"43.54000","Limite sur":"43.48677","Limite este":"-5.69771","Limite oeste":"-5.60898"}
            } 
            
alert(a.Features[0].coordinates.Longitud)
</script> 
Ni con esto otro:
Código PHP:
<?php
$a
='{"Status":"todo bien",
"Features":[
            {"coordinates":{"Longitud":"-5.64246","Latitud":"43.5348"},
            "properties":{"Nombr e":"El buen paladar","Direccion":null,"Distancia":4873252,"Des cripcion":"Se trata de un lugar especializado en las chuletas"}
            },
            {"coordinates":{"Longitud":"-5.65191","Latitud":"43.5391"},
            "properties":{"Nombr e":"la sardina saltarina","Direccion":null,"Distancia":4873833,"D escripcion":"establecimiento especializado en los manjares del mar"}
            },
            {"coordinates":{"Longitud":"-5.65145","Latitud":"43.5399"},"properties":{"Nombr e":"pizza movil","Direccion":null,"Distancia":4873916,"Descr ipcion":"pizzeria asquerosa pero barata"}
            },
            {"coordinates":{"Longitud":"-5.65337","Latitud":"43.5349"},"properties":{"Nombr e":"la tabernona","Direccion":null,"Distancia":4873388,"D escripcion":"especializada en las mejores cervezas"}
            },
            {"coordinates":{"Longitud":"-5.66601","Latitud":"43.5221"},
            "properties":{"Nombr e":"Zapico","Direccion":null,"Distancia":4872124," Descripcion":null}
            },
            {"coordinates":{"Longitud":"-5.64869","Latitud":"43.5368"},
            "properties":{"Nombr e":"Bahia","Direccion":null,"Distancia":4873543,"D escripcion":"hotel con vistas a la playa"}
            }],
            "Found":6,"Bounds":{"Limite norte":"43.54000","Limite sur":"43.48677","Limite este":"-5.69771","Limite oeste":"-5.60898"}
            } '
;
            
var_dump(json_decode($a));
?>
La salida de esto último:
Código PHP:
object(stdClass)#1 (4) {
  
["Status"]=>
  
string(9"todo bien"
  
["Features"]=>
  array(
6) {
    [
0]=>
    
object(stdClass)#2 (2) {
      
["coordinates"]=>
      
object(stdClass)#3 (2) {
        
["Longitud"]=>
        
string(8"-5.64246"
        
["Latitud"]=>
        
string(7"43.5348"
      
}
      [
"properties"]=>
      
object(stdClass)#4 (4) {
        
["Nombr e"]=>
        
string(15"El buen paladar"
        
["Direccion"]=>
        
NULL
        
["Distancia"]=>
        
int(4873252)
        [
"Des cripcion"]=>
        
string(50"Se trata de un lugar especializado en las chuletas"
      
}
    }
    [
1]=>
    
object(stdClass)#5 (2) {
      
["coordinates"]=>
      
object(stdClass)#6 (2) {
        
["Longitud"]=>
        
string(8"-5.65191"
        
["Latitud"]=>
        
string(7"43.5391"
      
}
      [
"properties"]=>
      
object(stdClass)#7 (4) {
        
["Nombr e"]=>
        
string(20"la sardina saltarina"
        
["Direccion"]=>
        
NULL
        
["Distancia"]=>
        
int(4873833)
        [
"D escripcion"]=>
        
string(53"establecimiento especializado en los manjares del mar"
      
}
    }
    [
2]=>
    
object(stdClass)#8 (2) {
      
["coordinates"]=>
      
object(stdClass)#9 (2) {
        
["Longitud"]=>
        
string(8"-5.65145"
        
["Latitud"]=>
        
string(7"43.5399"
      
}
      [
"properties"]=>
      
object(stdClass)#10 (4) {
        
["Nombr e"]=>
        
string(11"pizza movil"
        
["Direccion"]=>
        
NULL
        
["Distancia"]=>
        
int(4873916)
        [
"Descr ipcion"]=>
        
string(30"pizzeria asquerosa pero barata"
      
}
    }
    [
3]=>
    
object(stdClass)#11 (2) {
      
["coordinates"]=>
      
object(stdClass)#12 (2) {
        
["Longitud"]=>
        
string(8"-5.65337"
        
["Latitud"]=>
        
string(7"43.5349"
      
}
      [
"properties"]=>
      
object(stdClass)#13 (4) {
        
["Nombr e"]=>
        
string(12"la tabernona"
        
["Direccion"]=>
        
NULL
        
["Distancia"]=>
        
int(4873388)
        [
"D escripcion"]=>
        
string(37"especializada en las mejores cervezas"
      
}
    }
    [
4]=>
    
object(stdClass)#14 (2) {
      
["coordinates"]=>
      
object(stdClass)#15 (2) {
        
["Longitud"]=>
        
string(8"-5.66601"
        
["Latitud"]=>
        
string(7"43.5221"
      
}
      [
"properties"]=>
      
object(stdClass)#16 (4) {
        
["Nombr e"]=>
        
string(6"Zapico"
        
["Direccion"]=>
        
NULL
        
["Distancia"]=>
        
int(4872124)
        [
" Descripcion"]=>
        
NULL
      
}
    }
    [
5]=>
    
object(stdClass)#17 (2) {
      
["coordinates"]=>
      
object(stdClass)#18 (2) {
        
["Longitud"]=>
        
string(8"-5.64869"
        
["Latitud"]=>
        
string(7"43.5368"
      
}
      [
"properties"]=>
      
object(stdClass)#19 (4) {
        
["Nombr e"]=>
        
string(5"Bahia"
        
["Direccion"]=>
        
NULL
        
["Distancia"]=>
        
int(4873543)
        [
"D escripcion"]=>
        
string(27"hotel con vistas a la playa"
      
}
    }
  }
  [
"Found"]=>
  
int(6)
  [
"Bounds"]=>
  
object(stdClass)#20 (4) {
    
["Limite norte"]=>
    
string(8"43.54000"
    
["Limite sur"]=>
    
string(8"43.48677"
    
["Limite este"]=>
    
string(8"-5.69771"
    
["Limite oeste"]=>
    
string(8"-5.60898"
  
}

  #5 (permalink)  
Antiguo 24/04/2010, 16:57
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda JSON

Pero como lo has probado??
A mi tampoco me da problemas si hago json_encode() o json_decode() todo en el lado del servidor. El problema m surje cuando le llega el obejto al cliente, que lo recibe correctamente en JSON (de hecho el objeto que le llega es el que puse en el comentario anterior), pero al decodificarlo obtengo un null.

Es como si al transferir los el objeto mediante la sesion CURL, esta introdujese algo que no permite la decodificacion del objeto.

Saludos
  #6 (permalink)  
Antiguo 24/04/2010, 17:04
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: duda JSON

No entiendo bien. Si el objeto llega tal como lo has escrito (igual que como lo probé), no debería tener problemas en interpretarlo. Si llega exactamente así y falla, el problema entonces debe estar en la forma de parsear ese objeto.
  #7 (permalink)  
Antiguo 24/04/2010, 17:37
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda JSON

Ya yo tampoco entiendo que es lo que ocurre. Pero tampoco le puedo echar la culpa al json_encode() que hago en el lado del servicio web, porque para ver si funcionaba probe a hacer lo siguiente:

Código PHP:
$respuesta=array('Status'=>$errores,'Features'=>$datos'Found'=>$num'Bounds'=>$posicion);

    echo 
"respuesta sin codificar: ";print_r($respuesta);echo "<br><br>";
    
$respuesta=json_encode($respuesta);
    echo 
"respuesta codificada:";print_r($respuesta);echo "<br><br>";
    
$respuesta=json_decode($respuesta);
    echo 
"respuesta decodificada: ";print_r($respuesta);echo "<br><br>"

Y esto fue lo que salio por pantalla en el navegador:

respuesta sin codificar: Array ( [Status] => todo bien [Features] => Array ( [0] => Array ( [coordinates] => Array ( [Longitud] => -5.64246 [Latitud] => 43.5348 ) [properties] => Array ( [Nombre] => El buen paladar [Direccion] => Calle de Gregorio Marañón, 4, 33203 Gijón, Spain [Distancia] => 4873252 [Descripcion] => Se trata de un lugar especializado en las chuletas ) ) [1] => Array ( [coordinates] => Array ( [Longitud] => -5.65191 [Latitud] => 43.5391 ) [properties] => Array ( [Nombre] => la sardina saltarina [Direccion] => Calle de Menéndez Pelayo, Gijón, Spain [Distancia] => 4873833 [Descripcion] => establecimiento especializado en los manjares del mar ) ) [2] => Array ( [coordinates] => Array ( [Longitud] => -5.65145 [Latitud] => 43.5399 ) [properties] => Array ( [Nombre] => pizza movil [Direccion] => Calle de Emilio Tuya, 7, 33202 Gijón, Spain [Distancia] => 4873916 [Descripcion] => pizzeria asquerosa pero barata ) ) [3] => Array ( [coordinates] => Array ( [Longitud] => -5.65337 [Latitud] => 43.5349 ) [properties] => Array ( [Nombre] => la tabernona [Direccion] => Calle Ramón y Cajal, 20, 33204 Gijón, Spain [Distancia] => 4873388 [Descripcion] => especializada en las mejores cervezas ) ) [4] => Array ( [coordinates] => Array ( [Longitud] => -5.66601 [Latitud] => 43.5221 ) [properties] => Array ( [Nombre] => Zapico [Direccion] => Calle del Río Nervión, 23, 33210 Gijón, Spain [Distancia] => 4872124 [Descripcion] => Sidrería Zapico ) ) [5] => Array ( [coordinates] => Array ( [Longitud] => -5.64869 [Latitud] => 43.5368 ) [properties] => Array ( [Nombre] => Bahia [Direccion] => Calle de Piles, 3, 33203 Gijón, Spain [Distancia] => 4873543 [Descripcion] => hotel con vistas a la playa ) ) ) [Found] => 6 [Bounds] => Array ( [Limite norte] => 43.54000 [Limite sur] => 43.48677 [Limite este] => -5.69771 [Limite oeste] => -5.60898 ) )

respuesta codificada:{"Status":"todo bien","Features":[{"coordinates":{"Longitud":"-5.64246","Latitud":"43.5348"},"properties":{"Nombr e":"El buen paladar","Direccion":null,"Distancia":4873252,"Des cripcion":"Se trata de un lugar especializado en las chuletas"}},{"coordinates":{"Longitud":"-5.65191","Latitud":"43.5391"},"properties":{"Nombr e":"la sardina saltarina","Direccion":null,"Distancia":4873833,"D escripcion":"establecimiento especializado en los manjares del mar"}},{"coordinates":{"Longitud":"-5.65145","Latitud":"43.5399"},"properties":{"Nombr e":"pizza movil","Direccion":null,"Distancia":4873916,"Descr ipcion":"pizzeria asquerosa pero barata"}},{"coordinates":{"Longitud":"-5.65337","Latitud":"43.5349"},"properties":{"Nombr e":"la tabernona","Direccion":null,"Distancia":4873388,"D escripcion":"especializada en las mejores cervezas"}},{"coordinates":{"Longitud":"-5.66601","Latitud":"43.5221"},"properties":{"Nombr e":"Zapico","Direccion":null,"Distancia":4872124," Descripcion":null}},{"coordinates":{"Longitud":"-5.64869","Latitud":"43.5368"},"properties":{"Nombr e":"Bahia","Direccion":null,"Distancia":4873543,"D escripcion":"hotel con vistas a la playa"}}],"Found":6,"Bounds":{"Limite norte":"43.54000","Limite sur":"43.48677","Limite este":"-5.69771","Limite oeste":"-5.60898"}}

respuesta decodificada: stdClass Object ( [Status] => todo bien [Features] => Array ( [0] => stdClass Object ( [coordinates] => stdClass Object ( [Longitud] => -5.64246 [Latitud] => 43.5348 ) [properties] => stdClass Object ( [Nombre] => El buen paladar [Direccion] => [Distancia] => 4873252 [Descripcion] => Se trata de un lugar especializado en las chuletas ) ) [1] => stdClass Object ( [coordinates] => stdClass Object ( [Longitud] => -5.65191 [Latitud] => 43.5391 ) [properties] => stdClass Object ( [Nombre] => la sardina saltarina [Direccion] => [Distancia] => 4873833 [Descripcion] => establecimiento especializado en los manjares del mar ) ) [2] => stdClass Object ( [coordinates] => stdClass Object ( [Longitud] => -5.65145 [Latitud] => 43.5399 ) [properties] => stdClass Object ( [Nombre] => pizza movil [Direccion] => [Distancia] => 4873916 [Descripcion] => pizzeria asquerosa pero barata ) ) [3] => stdClass Object ( [coordinates] => stdClass Object ( [Longitud] => -5.65337 [Latitud] => 43.5349 ) [properties] => stdClass Object ( [Nombre] => la tabernona [Direccion] => [Distancia] => 4873388 [Descripcion] => especializada en las mejores cervezas ) ) [4] => stdClass Object ( [coordinates] => stdClass Object ( [Longitud] => -5.66601 [Latitud] => 43.5221 ) [properties] => stdClass Object ( [Nombre] => Zapico [Direccion] => [Distancia] => 4872124 [Descripcion] => ) ) [5] => stdClass Object ( [coordinates] => stdClass Object ( [Longitud] => -5.64869 [Latitud] => 43.5368 ) [properties] => stdClass Object ( [Nombre] => Bahia [Direccion] => [Distancia] => 4873543 [Descripcion] => hotel con vistas a la playa ) ) ) [Found] => 6 [Bounds] => stdClass Object ( [Limite norte] => 43.54000 [Limite sur] => 43.48677 [Limite este] => -5.69771 [Limite oeste] => -5.60898 ) )



Puedo ver que al decodificar el objeto, ya no tengo un array, sino algo que empieza por stdClass Object. Pero tampoco le doy mucha importacia a eso.

Despues vuelvo a codificarlo y lo envio al cliente. Si el cliente intenta hacer un json_decode sobre el objeto recibido ya no puede. Obtiene un NULL.

¿Se os ocurre donde puede estar el fallo?

Saludos a todos y muchas gracias por seguir ayudandome
  #8 (permalink)  
Antiguo 25/04/2010, 07:10
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: duda JSON

Lo único que se me ocurre es que lo que llamas cliente tenga php 4 (json_encode y json_decode se agregaron en php 5).
  #9 (permalink)  
Antiguo 25/04/2010, 09:11
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda JSON

Na eso no es, tengo 5.2.10 de todas formas muchisimas gracias por tu tiempo Panino
  #10 (permalink)  
Antiguo 25/04/2010, 09:48
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: duda JSON

Creo haber descubierto lo que te está pasando:
Código PHP:
<?php 
$respuesta
=array('Status'=>'kkk','Features'=>'123''Found'=>'abc''Bounds'=>456); 

    echo 
"respuesta sin codificar: ";print_r($respuesta);echo "<br><br>"
    
$respuesta=json_encode($respuesta); 
    echo 
"respuesta codificada:";print_r($respuesta);echo "<br><br>"
    
$respuesta=json_decode($respuesta); //entrega un objeto
    
echo "respuesta decodificada: ";print_r($respuesta);echo "<br><br>"
     
$n=json_encode($respuesta); //entrega string
     
$z=json_decode($respuesta);//falla porque json_decode espera como argumento un string y le estás pasando un objeto
     
echo '<br />----------------------<br />';
     
var_dump($z);
     
$z=json_decode($n);//no falla porque estás entregando un string como argumento
      
echo '<br />----------------------<br />';
       
var_dump($z);
    
?>
  #11 (permalink)  
Antiguo 25/04/2010, 15:11
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda JSON

Buenas

Pero la solucion que me ofreces solo podria aplicarla al lado del servidor (al web service) y efectivamente funciona.

Pero cuando paso la informacion al cliente es cuando surje el problema, es el momento en el que no m permite decodificar el objeto JSON.

Muchas gracias una vez y saludos
  #12 (permalink)  
Antiguo 25/04/2010, 16:35
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: duda JSON

No sé si comprendo bien. Al cliente sólo le tiene que llegar un string JSON bien formado.
Si le llega eso, ya puede usarlo, ya sea vía javascript, con cualquiera de los métodos de parseo normales (eval, setTimeout, new Function, Native JSON, etc) o en php usando json_decode.
Ahora bien, si lo que sucede es que cuando usa json_decode el resultado es null, es porque en lugar de estar recibiendo un string con el objeto json lo que está recibiendo es otra cosa (muy probablemente un objeto stdClass).
  #13 (permalink)  
Antiguo 25/04/2010, 18:16
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda JSON

Si eso debe ser lo que esta saliendo mal. La sesion CURL debe estar alterando de alguna forma el objeto, por lo que el json_decode no es capaz a parsearlo. El problema esta en que no se como evitar eso.

He trabajado con otros servicios web, hechos por profesionales, y el obejto JSON que devuelven a traves de la sesion CURL puede decodificarse en un array sencillamente a traves del metodo json_decode.

Por tanto el problema lo estoy teniendo en el web service que estoy desarrollando, al crear el objeto JSON algo estoy haciendo mal.

No obstante, podrias explicarme cual es la diferencia entre un obejto JSON y un stdClass?? para ver si quizas se me ocurre donde puede estar el fallo

Gracias y un saludo
  #14 (permalink)  
Antiguo 25/04/2010, 19:22
 
Fecha de Ingreso: abril-2009
Mensajes: 80
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: duda JSON

Bueno ya esta!!!!!.

El problema como me comentabas era en el objeto JSON que intendaba decodificar con json_decode(). Por lo visto esta funcion es muy sensible y el meno fallo que haya, falte una coma, no esten los datos ordenados correctamente y cosas asi pues ya casca y devuelve un null

Lo mas gracioso de todo es que si una serie de arrays aninados los codificas con json_encode(), los envias a traves de una sesion curl a otra pagina y en esa pagina los intentas decodificar con json_decode() pues resulta que casca...

Al final he estudiado como funciona JSON, como es el formato de los datos que contiene y todo eso y lo tuve que componer la respuesta añadiendo los caraceteres uno por uno y olvidandome de la falsa comodida de json_encode()


Muchas gracias por todo el tiempo que has dedicado a ayudarme Panino, eres un crack!!
  #15 (permalink)  
Antiguo 25/04/2010, 19:49
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: duda JSON

Yo hice esta prueba
Código PHP:
Ver original
  1. <?php
  2. $arr = array();
  3. $arr['foo'][] = 'bar1';
  4. $arr['foo'][] = 'bar2';
  5. $arr['foo'][] = 'bar3';
  6. $arr['bar'][] = 'foo1';
  7. $arr['bar'][] = 'foo2';
  8. $arr['bar'][] = 'foo3';
  9. echo json_encode($arr);
Luego en otra página hice esto
Código PHP:
Ver original
  1. <?php
  2. $json= file_get_contents('http://localhost/json.php');
Claro está, lo hice con file_get_contents, pero debería ser lo mismo con cURL y me trajo correctamente los datos.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: json
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 08:54.