La advertencia le dice la mayor parte de lo que está mal. A menos que indique JSON
cómo manejar benedict referencias (objetos Perl), JSON
maneja estructuras de datos no bendecidas.
Puede convert_blessed
y puede allow_blessed
. Para allow_blessed
, que dice:
If $enable
is false (the default), then encode will throw an exception when it encounters a blessed object.
Point es una clase de objeto, por tanto, una instancia de Point
es una referencia bendita, y por lo tanto el valor predeterminado para JSON
es lanzar una excepción.
Si habilita convert_blessed
, se llamará a un método TO_JSON
en su objeto. Con simples objetos como Point
(unidades que no contienen miembros bendecidos), se puede hacer eso con tanta facilidad como:
sub TO_JSON { return { %{ shift() } }; }
Si tiene que descender por una estructura, se obtendrá una gran cantidadmás peludo.
Alguien en los comentarios a continuación dice que no cubrí cómo conseguir objetos cabo de JSON.
Lo básico es simple. Así que aquí va
my $object = bless(JSON->new->decode($json_string), 'ClassIWant');
he cubierto principalmente la parte que impide que simplemente de la serialización de un objeto bendito en JSON.
Los conceptos básicos de la deserialización son simples, al igual que los conceptos básicos de la serialización son simples, una vez que conoce el truco. No hay ningún error en el camino, solo existe la tarea de encontrar lo que necesita y bendecirlo en la clase correcta.
Si desea tener un código acoplado a los objetos, sabrá lo que tiene que ser bendecido y en qué tendrá que ser bendecido. Si desea un código totalmente desacoplado, , esto no es más difícil o más fácil en Perl que en el propio JavaScript.
Vas a tener que serializar un marcador en el JSON. Si necesito algo como esto, insertaré un campo '__CLASS__'
en los objetos bendecidos. Y cuando deserializar, que descenderá a través de la estructura y bendigo todo como esto:
bless($ref, delete $ref->{__CLASS__});
Pero como ya he dicho, esto no es más fácil o más difícil es en Perl, porque JSON presenta el mismo desafío a todos los idiomas.
Como Schwern sugirió en su comentario arriba, YAML está mucho mejor construido para serializar y deserializar objetos, porque tiene notación para él. JSON le ofrece matrices o matrices asociativas.
A menos que necesite específicamente JSON, le sugiero que use YAML para esta tarea. JSON no tiene sintaxis para indicar que algo es un objeto. YAML lo hace. Deberá unir manualmente algo o usar una extensión de lenguaje JSON como JSYNC. Si todo lo que necesita hacer es serializar un objeto Perl, use Data :: Dumper o Storable. – Schwern
Originalmente desarrollé la solución en XML pero descubrí que JSON podría recortar la cadena porque a otras secuencias de comandos usando STDIN, sin importar la complejidad y la ilegibilidad de JSON, decidí volver a XML, lo cual es fácil de analizar. – Ibrahim