Página 1 de 1

Decodificar respuesta de Webservice

NotaPublicado: 2013-06-30 07:59 @374
por danimera
Hago una llamada a un webservice, pero lastimosamente el resultado parece que me lo devuelve en JSON, pero tiene unos slash que me generan problemas... o barras invertidas...

Tengo mi my $content = $mech->content();

Y el contenido se me muestra como algo así:
Código: Seleccionar todo
$VAR1 = '{"d":"[{\\"Id\\" : \\"48790\\", \\"IdEdicion\\" : \\"1\\", \\"IdTipoItem\\" : \\"16\\", \\"IdSeccion\\" : \\"37\\", \\"AnteTitulo\\" : \\"Club gastronómico\\", \\"Titulo\\" : \\"\\u0027The Green Samán’\\", \\"Resumen\\" : \\"A Cali llega una propuesta en donde los amantes de la buena mesa tendrán su propio puesto. \\", \\"RutaImagen\\" : \\"http://www.xxx.com.co/upload/images/2012/2/27/48793_164756_29.jpg\\", \\"UrlFriendly\\" : \\"/cali/restaurantes-cali/sucursal/the-green-saman/48790\\", \\"FechaUltimaModificacion\\" : \\"10/2/2012 3:36:00 PM\\"},{\\"Id\\" : \\"48352\\", \\"IdEdicion\\" : \\"1\\", \\"IdTipoItem\\" : \\"16\\", \\"IdSeccion\\" : \\"37\\", \\"AnteTitulo\\" : \\"Un plan\\", \\"Titulo\\" : \\"Karen\\u0027s Pizza \\", \\"Resumen\\" : \\"Un lugar en donde la pizza, pastas, postres y cocteles toman una dimensión divertida, elegante y con toques de distinción. Cuenta con siete sucursales en la capital vallecaucana.\\", \\"RutaImagen\\" : \\"http://www.xxx.com.co/upload/images/2012/2/16/48353_22131_29.jpg\\", \\"UrlFriendly\\" : \\"/cali/restaurantes-cali/sucursal/karens-pizza/48352\\", \\"FechaUltimaModificacion\\" : \\"10/2/2012 3:36:00 PM\\"},{\\"Id\\" : \\"48222\\",


Para lo cual, obviamente decodificar JSON en Perl no me funciona, y honestamente ya no sé cómo obtener esa información... Debería poder pasarla a un array...

Re: Decodificar respuesta de Webservice

NotaPublicado: 2013-06-30 08:52 @411
por danimera
Generalmente cuando tengan un problema así:
Hay que ver si la codificación está en UTF8, logré solucionarlo haciendo algo como:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use utf8;
  2. $sitios = $response->content; #Request de mi mech
  3. utf8::encode($sitios);
  4. $sitios = $self->dec_json($sitios); #obviamente tengo una función que hice llamada dec_json
  5.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Decodificar respuesta de Webservice

NotaPublicado: 2013-06-30 09:31 @438
por explorer
No necesitas poner 'use utf8;' para usar utf8::encode().

Extraído de perldoc utf8:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    Funciones auxiliares
       Las siguientes funciones se definen en el paquete "utf8::" en el núcleo de Perl. No necesita decir "use utf8" para usarlas y, de hecho, no debería hacerlo a menos que el código fuente esté realmente en UTF-8.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Es más... el propio paquete JSON dispone de su propia función de decodificación, así que tampoco necesitas llamar a esa función:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   my ($json_url) = @_;
  2.   my $browser = WWW::Mechanize->new();
  3.  
  4.   eval{
  5.     # descargar la página json:
  6.     print "Obteniendo json $json_url\n";
  7.     $browser->get( $json_url );
  8.  
  9.     my $contenido = $browser->content();
  10.     my $json = JSON->new();
  11.  
  12.     my $json_texto = $json->allow_nonref->utf8($contenido);
  13.  
  14.     my @json_decodificado = decode_json($json_texto);
  15.     print Dumper(@json_decodificado), length(@json_decodificado), "\n";
  16.     ...;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

También hay posibilidad de pasarlo, directamente, a una estructura Perl:

$perl_scalar = from_json( $json_texto, { utf8 => 1 } );

que es equivalente a escribir todo esto:

$perl_scalar = JSON->new->utf8(1)->decode($json_texto);

aunque el módulo recomienda usar mejor decode_json(), ya que lo hace a partir de datos que estén en utf8.

Re: Decodificar respuesta de Webservice

NotaPublicado: 2013-06-30 11:11 @507
por danimera
Bueno, realmente la solución era la codificación utf8 para poder pasar el json...

Me gusta más tu solución, explorer, como siempre...