Предупреждение говорит вам о том, что не так. Если вы не скажете JSON
, как обрабатывать благословенные ссылки (объекты Perl), JSON
дескрипторы только неблаженные структуры данных.
Вы можете convert_blessed
, и вы можете allow_blessed
. Для allow_blessed
написано:
Если $enable
равно false (по умолчанию), то при кодировании будет выдано исключение при обнаружении благословенного объекта.
Точка является классом объекта, поэтому экземпляр Point
является благословенной ссылкой, и, следовательно, по умолчанию для JSON
выбрасывается исключение.
Если вы включите convert_blessed
, он вызовет метод TO_JSON
для вашего объекта. С простыми объектами, такими как Point
(которые не содержат благословенных членов), вы можете сделать это так же просто, как:
sub TO_JSON { return { %{ shift() } }; }
Если вам придется спуститься по структуре, она получит лот хайриер.
Кто-то в комментариях ниже сказал, что я не рассказал, как получить объекты из из JSON.
Основы просты. Итак, вот идет
my $object = bless( JSON->new->decode( $json_string ), 'ClassIWant' );
В основном я рассмотрел ту часть, которая не позволяет просто сериализовать благословенный объект в JSON.
Основы десериализации просты, как и основы сериализации просты - как только вы знаете хитрость. На этом пути нет ошибок, есть только задача найти то, что вам нужно, и благословить его в нужном классе.
Если вы хотите, чтобы код был связан с объектами, тогда вы будете знать, что должно быть благословлено и во что оно должно быть благословлено. Если вам нужен полностью отделенный код, это не сложнее и проще в Perl, чем в самом JavaScript .
Вам нужно будет сериализовать маркер в JSON. Если мне нужно что-то вроде этого, я вставлю поле '__CLASS__'
в благословенные объекты. И при десериализации я спущусь через структуру и благословлю все, как это:
bless( $ref, delete $ref->{__CLASS__} );
Но, как я уже сказал, в Perl это не легче и не сложнее, потому что JSON представляет одну и ту же проблему для всех языков.
Как Шверн предложил в своем комментарии к началу, YAML гораздо лучше построен для сериализации и десериализации объектов, потому что он имеет обозначение для него. JSON предоставляет ассоциативные массивы или массивы.