[caracas-pm] Evaluar null en JSON

Alejandro Imass ait at p2ee.org
Thu Mar 6 08:22:05 PST 2014


2014-03-06 10:47 GMT-05:00 Alberto Mijares <amijaresp at gmail.com>:
> Hola lista:
>
> Me está ocurriendo algo muy extraño y por eso consulto con ustedes.
>
> Tengo un script que consulta un webservice. Este devuelve un paquete
> JSON. Aunque es un error que debe solucionar el desarrollador del
> webservice, a veces me está devolviendo valores null. Mientras eso se
> soluciona de aquel lado, yo necesito manejar la excepción. Entonces
> tengo, después de inicializar mi objeto JSON y todo eso:
>
> for (@{$json->{lista}}) {
>
> my $valor;
>
> defined($_->{valor}) ? $valor = $_->{valor} : $valor = 'INDEFINIDO';
>
> }
>
> Pero ocurre que siempre $valor = 'INDEFINIDO', y no siempre el valor
> en el JSON es null. Se supone que un valor null en JSON se transforma
> en undef, ¿no es así?
>

Asumo que es JSON > 2.x pq versiones previas tienen algunos problemitas.

perldoc JSON busca MAPPING y lo que indicas es correcto, no obstante:

Hay serializadores JSON que no usan false,true,null correctamente (ver
http://www.json.org), o bien el programador del otro lado no sabe la
diferencia entre un empty string, null y "null", o referencias vacías
tales como [] y {}. Para poder ayudarte mejor debes colocar un ejemplo
del JSON que estas recibiendo. Null en JSON es el literal null sin
comillas de esta forma:  "key": null nota que no tiene comillas, y es
diferente a "key":"null" y diferente a "key":,  y es diferente a
"key": { }, y es diferente si el "key" no existe.

Es posible que estes recibiendo un { } por lo que quizás siempre está
defined. Si no quieres tomar riesgos y no hay un contrato claro con el
otro lado, lo mejor es validar de izq a derecha TODO lo que puedas y
aprovechar el short-circuit del operador && (i.e. que no sigue
evaluando hacia la derecha una vez que alguno sea falso):

my $scalar = defined $_->{valor} && ref $_->{valor} eq 'SCALAR' &&
$_->{valor} ne '' ? foo : bar;

YAML/JSON son schema-less by design pero hay algunas iniciativas para
crear esquemas y poder validar estructuras JSON/YAML antes de
parsearlas y muchos argumentan que pierde el chiste de usar YAML in
the first place.

Por eso es importante que exista un buen contrato (o te resguardes
bien) si vas a intercambiar información en JSON con otra gente en
otras plataformas.

Saludos,

Alejandro


More information about the caracas-pm mailing list