[caracas-pm] Evaluar null en JSON

Alberto Mijares amijaresp at gmail.com
Thu Mar 6 14:24:41 PST 2014


>
> 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.


Gracias por tu respuesta, Alejandro.

Para estar seguro, lo que hice fue un print del objeto con

Dumper $json;

Efectivamente, el JSON viene bien y en Perl veo elementos como

'valor' => undef

lo que quiere decir que no hay problemas con lo que estoy recibiendo.

Lo que hice fue otras pruebitas con unos oneliners y encontré algo
interesante. Tal vez me ayudes a descifrarlo:

$ perl -E '$h=[{a=>1,b=>undef}]; for (@{$h}) { defined($_->{b}) ? say
"si" : say "no";};'

y obtengo un "no", como es de esperar.

Con

$ perl -E '$h=[{a=>1,b=>undef}]; for (@{$h}) { defined($_->{b}) ? say
"si" : say "no";};'

obtengo un "si".

Pero para reproducir exactamente mi pedazo de código lo amplié un poco

$ perl -E '$h=[{a=>1,b=>undef},{a=>1,b=>2}]; for (@{$h}) {
defined($_->{b}) ? $r=$_->{b} : $r=3; say $r;};'

Yo hubiese esperado obtener

3
2

Pero no. Obtuve

3
3

¿Qué opinas?

Saludos


Alberto Mijares


More information about the caracas-pm mailing list