• Publicidad

Decodificar respuesta de Webservice

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Decodificar respuesta de Webservice

Notapor danimera » 2013-06-30 07:59 @374

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...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Decodificar respuesta de Webservice

Notapor danimera » 2013-06-30 08:52 @411

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
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Decodificar respuesta de Webservice

Notapor explorer » 2013-06-30 09:31 @438

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.001 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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Decodificar respuesta de Webservice

Notapor danimera » 2013-06-30 11:11 @507

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...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron