in reply to JSON.pm and mod_perl

I'm a bit confused as to why its doing this :(

Because you're sending a JSON::Tiny::_Bool object to be processed by JSON is my guess. It can handle its own JSON::Booleans but not the objects from JSON::Tiny.

If you want to switch, you will have to remove *all* of the old code. And just to back up and check: you are restarting the apache httpd on all code changes, right? And while you describe the outcome/problem, you haven't shown any code to duplicate it. How were you writing true and false before the perfectly acceptable \1 and \0? I'm unsure where threading comes into this as a problem. Where did you hear that you should use JSON::Tiny instead? (It wouldn't even install for me.)

Replies are listed 'Best First'.
Re^2: JSON.pm and mod_perl
by ultranerds (Hermit) on Mar 30, 2016 at 14:16 UTC
    Thanks for the reply. So, with my old code (just using the JSON module), I was using:

    True and false:
    $values->{foo} = JSON::true(); $values->{foo2} = JSON::false();
    ...and then encoding them with:

    use JSON; my $json = JSON->new; $json->allow_blessed(1); print $json->encode($values);


    With the new code (using just JSON::Tiny), I was simply doing:
    $values->{foo} = JSON::Tiny->true; $values->{foo2} = JSON::Tiny->false;
    ..and then to encode:

    print encode_json($values);

    ..and also tried:

    print to_json($values);

    I read about the threading issue here: http://www.perlmonks.org/?node_id=1021294

    Cheers

    Andy

      Hmmm. Real bug, looks like(?). I don't have a modperl install to play with though so can't comment on that.

      Since the string allow_blessed does not appear in JSON::Tiny I have to assume you are still loading JSON somewhere. You'll either need to comb through code/%INC to find and remove it or perhaps fully qualify your calls to JSON::Tiny::encode_json() etc.

      Sidenote: you do not need allow_blessed to be true if working with JSON bools. Setting it true in general is probably a bad practice. Throwing around objects can mean revealing much more information than intended. You might, for example, send a list of user objects to the webpage via ajax and end up showing private information that is in the object like addresses or real names when you just meant to show username and webpage.

      perl -MJSON -le 'print encode_json({o=>JSON::true()})' {"o":true}
        Thanks for the reply. I had a play with it, and you are indeed correct - I had the JSON module loaded further up the script, which would have been clashing with the JSON::Tiny functions. Cleaned that up, and works now :)

        >>Sidenote: you do not need allow_blessed to be true if working with JSON bools. Setting it true in general is probably a bad practice. Throwing around objects can mean revealing much more information than intended. You might, for example, send a list of user objects to the webpage via ajax and end up showing private information that is in the object like addresses or real names when you just meant to show username and webpage.<<

        Yeah - I'm not too sure why it brought up that error (we had to update the code from a basic JSON->encode_json($var), to the more complex code you see above, as it kept (seemingly randomly) complaining about allow_blessed. I guess that could also be something to do with mod_perl as well (not seen that error since we updated it though)

        Cheers

        Andy