Нравится мне это или нет, но моим окончательным решением было вернуться к устаревшему 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)