Как превратить объекты Moose в JSON для использования в Catalyst? - PullRequest
2 голосов
/ 03 августа 2010

У меня есть серия объектов Moose, которые я собираюсь передать JSON :: XS посредством Catalyst :: View :: JSON .JSON :: XS не может кодировать благословенные структуры данных.Я знаю, что есть MooseX :: Storage :: Format :: JSON , который может - своего рода - делать то, что я хочу;но, кажется, слишком тяжелым.То, что я ищу, по сути та же информация, что XXX.pm .Я просто хочу, чтобы структуры необработанных данных рекурсивно не обрабатывались, чтобы JSON::XS (драйвер для JSON::Any, который C:V:JSON использует внутри) мог отображать его.

Как лучше всего использовать Catalyst::View::JSON иJSON::XS с Moose объектами?Кажется, у меня есть четыре очевидных варианта:

  1. Заставить Catalyst::View::JSON работать с объектами Moose, исправив C:V:JSON для чтения из freeze и завершить запрос, если представленный аргумент является объектом Moose.
  2. Исправление JSON::XS для возврата к возвращаемому значению $obj->freeze if $obj->isa('Moose') && $obj->does('MooseX::Storage::Format::JSON').Я должен заглянуть в MX:S:F:JSON, чтобы убедиться, что класс, используемый JSON::Any и прокси MX:S:F:JSON, равен JSON::XS (не хочется думать об изобилии ошибок, если JSON::Any выбирает другой внутренний кодировщик для Mooseобъект, который JSON::XS вызывается для использования.
  3. Выясните, как рекурсивно-не использовать, и пусть Catalyst::View::JSON сделает свое дело.
  4. Не используйте Catalyst::View::JSON вообще. Просто напишитеSTDOUT $obj->freeze и ручное завершение запросов .. Это кажется самым хакерским.

Я уверен, что есть другие варианты, есть идеи? Какая моя лучшая ставка?

Ответы [ 3 ]

5 голосов
/ 03 августа 2010

Я склонен использовать вариант 3, используя MooseX :: Storage, чтобы обеспечить метод pack(), который возвращает структуру данных Perl, которую я могу вставить в свой тайник, чтобы View мог отображать его по своему выбору.Также обратите внимание, что JSON :: Any может быть принудительно (окружением или путем передачи соответствующих параметров в import()) выбрать конкретный бэкэнд.Так работает набор тестов, и он задокументирован.

4 голосов
/ 03 августа 2010

Если вас не волнует полная очистка вашего объекта и невозможность его использования (с точки зрения Moose), попробуйте unbless от Data::Structure::Util.

Я лично предпочитаю MooseX::Storage для более элегантногои устойчивое решение.

0 голосов
/ 04 августа 2010

Нравится мне это или нет, но моим окончательным решением было вернуться к устаревшему JSON :: Syck , который делает именно то, что я хочу.Вот быстрый не-Moose пример логической не-Moose сериализации в JSON.

use JSON::Syck;
use URI;
use feature ':5.10';
say JSON::Syck::Dump(
 bless { foo => URI->new("http://www.evancarroll.com") }
)

Я писал автору о JSON :: XS , он не был игрой для добавления функциональности.Вот часть текста (вырванного из контекста из многочисленных сообщений, чтобы показать, почему эта функция отсутствует) из Марк Леманн сопровождающий JSON :: XS:

Нетпотому что вы используете JSON , а не Perl .Очевидно, что Perl способен представлять любую структуру данных Perl, но JSON нет, поэтому вам нужно указать, что делать.Многие люди наивно просят что-то вроде «просто сбросить структуру данных», но JSON даже не может представить все структуры данных perl, которые не являются объектами.

...

Ваш вопрос похож на: почему я не могу отправить это изображение размером 1 МБ в формате JPEG в виде файла ascii - просто потому, что ascii не может представлять октеты.

...

Или, может быть, вы просто хотите добавить в него мусор иожидайте, что JSON :: XS сделает то, что хорошо для вас (но неправильно для других людей) - у JSON :: XS просто нет возможности волшебным образом угадать, что вы хотите.

...

TO_JSON это так.Все остальное просто дикие догадки.

...

Тогда, возможно, вам стоит попробовать то, что JSON действительно может представить.Создание какой-то иерархии объектов и надежда на то, что это сделает «правильную вещь», явно плохая разработка программного обеспечения - старайтесь не прибегать к взлому, когда ваш протокол требует JSON, а затем отправьте JSON, не ожидайте, что библиотека json исправит ваш недействительныйсообщение в первую очередь.

Я не знаю, как реагировать на это, кроме Я НЕ ЗАБЫВАЮ.ПРОСТО РАБОТАЙ!LIKE :: SYCK .Я не ожидаю, что объекты преобразуются в JSON идеально.Но, я думаю, я падаю на 80%, которые просто хотят, чтобы это работало.Я использую JSON для импорта jQuery, а не выполняю банковские операции во время операции на мозге.В конечном счете, я не хочу использовать специальную роль ... Я хочу, чтобы все, что отправлено ей, было волшебным образом преобразовано для меня в уровень, который делает его полезным в ответ на запрос JQuery JSON.

UPDATE

Извините, я пропустил эти ответы, пока кто-то не сказал, что я троллю в не связанной среде.MooseX :: Storage не работает для классов, отличных от Moose, я хочу общий способ представления тайника в формате JSON.К сожалению, некоторые из этих членов тайника являются объектами Moose.XML :: Simple может сделать это, Data::Dumper может сделать это, JSON :: Syck может сделать это, список можно продолжить - я просто хочу, чтобы это было сделано.Это не обязательно должно быть 1: 1 с Perl, и, честно говоря, я хочу, чтобы это было сделано достаточно близко к тому, как JSON::Syck делает это по умолчанию.Мой аргумент здесь такой: «Как заставить JSON::XS работать точно так же, как JSON::Syck в настоящее время»?И твой ответ - ты не можешь.Так что я не использовал другое решение.Написание кода стоит денег, зачем мне писать to_JSON, если Syck уже все делает правильно ... Я хотел бы сказать, что бремя лежит на недобросовестных людях, чтобы показать, что Syck сериализует моду, которая нежелательно.Кроме того, имейте в виду, что JSON::Syck был посеян Audry , который ни в коем случае не является троллем, идиотом или "поврежденным мозгом";или любой другой термин, который мне бросают.Я закончу с этим: отсутствие плохого маршрута сериализации JSON::Syck и желаемый результат уже только что работающий приводит меня к мысли, что это хороший выбор для меня.И что может MooseX :: *: JSON делать по-другому с произвольным объектом Moose?Почему вы думаете, что код не может быть написан для принятия объекта Moose, а не метода для него?Если вы думаете иначе, ответьте чем-то существенным - я хотел бы увидеть лучший ответ.Благодарю.(направлено на @jrockway и @Ether)

...