Like it or hate it my ultimate solution was to revert back to the now deprecated JSON::Syck which does exactly what I want. Here is a quick non-Moose example of logical non-Moose serialization to JSON.
use JSON::Syck;
use URI;
use feature ':5.10';
say JSON::Syck::Dump(
bless { foo => URI->new("http://www.evancarroll.com") }
)
I wrote the author about JSON::XS he was not game for adding the functionality. Here is some of the text (taken out of context from numerous messages to show why this feature isn't there) from Marc Lehmann the JSON::XS maintainer:
No, because you are using JSON and
not Perl. Perl is obviously capable
of representing any Perl data
structure, but JSON is not, so you
need to tell it what to do. Many
people naively request something like
"just dump the data structure", but
JSON can't even represent all perl
data structures that are non-objects.
...
Your question is like: why can't I
send this 1MB jpeg image as ascii file
- simply because ascii cannot represent octets.
...
Or maybe you justw ant to to throw
some garbage at it and expect JSON::XS
to do what is good for you (but wrong
for other people) - there is simply no
way for JSON::XS to magically guess
what you want.
...
TO_JSON is it. Anything else is just
wild guessing.
...
Then maybe you should try stuff that
JSON can actually represent. Throwing
some object hierarchy at it and hoping
it would do "the right thing" is
clearly bad software engineering - try
not to resort hacks, when your protocl
requires JSON, then send JSON, don't
expect the json library to fix up your
invalid message in the first place.
I don't know how to respond to that, other than I DON'T CARE. JUST WORK! LIKE ::SYCK. I don't expect objects to transform to JSON perfectly. But, I think I fall in the 80% that just want it to work. I'm using JSON for jQuery import not performing banking transactions during brain surgery. Ultimately, I don't want to use a special role... I want anything sent to it to magically be transformed for me to a level that makes it useful in a response to a jQuery JSON request.
UPDATE
Sorry, I missed these replies until someone said I was trolling in an unrelated medium. MooseX::Storage doesn't work for non-Moose classes, I want a general way to represent the stash in a JSON format. Unfortunately, some of those members of the stash are Moose objects. XML::Simple can do this, Data::Dumper
can do this, JSON::Syck can do this, the list goes on -- I just want it done. It doesn't have to be 1:1 with Perl, and to be honest I want it done fairly close to the way JSON::Syck
does it by default. My argument here then, is, "How do I get JSON::XS
to work exactly like JSON::Syck
does currently"? And, your answer is you can't. So I've not employed a different solution. Writing code costs money, why would I want to write to_JSON
if Syck is already doing it right... I'd like to say the burden is on the nay-sayers to show what Syck is serializing a fashion that isn't desirable. Also, do keep in mind JSON::Syck
was seeded by Audry, who is by no means a troll, idiot, or "brain damaged"; or, any of the other terms that are being thrown my way. I will close with this: the lack of a bad serialization route of JSON::Syck
and the desired output already just-working leads me to believe this is a good choice for me. And, what could MooseX::*:JSON be doing differently with an arbitrary Moose object? Why do you think that code can't be written to accept a Moose object rather than a method on it? If you think otherwise, answer with something of substance -- I'd like to see a better response. Thanks. (directed toward @jrockway, and @Ether)