Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

jesse (2531)

jesse
  (email not shown publicly)

Journal of jesse (2531)

Monday May 05, 2008
08:54 PM

Binary data in JSON?

[ #36332 ]
JSON doesn't have native support for binary data? Really? Someone, please tell me I'm wrong. (But only if you can back it up with documentation)
The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • Can you fudge it?

    { "bytestring": [ 3,2,12,3,12,31,210,2,18] }
    --
    rjbs
    • I can manually marshal into base64 which will be a lot more compact than something like the array bytestring hack. but then everyone consuming my format needs to come up with the same extension and needs to sniff values for encoding. and that makes me cry.
  • Nope, it doesn't. I believe that's because JSON is valid JavaScript syntax and there's no "natural" way to represent binary in a simple string format.

  • A JavaScript string is defined as a "sequence of zero or more 16-bit unsigned integer values." (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf)

    and http://json.org/ [json.org] says "A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. [...]. A string is very much like a C or Java string."

    Does that mean JSON "doesn't have native support for binary data"? Depends on your needs I guess (and whether you control the sending and/or receivin
  • Not related to JSON directly, but I've been reading the ajaxian the other day, and one guy managed to put the Prototype.js into a compressed PNG and read it back with the canvas methods. The whole 124K lib shrank to 30K: http://ajaxian.com/archives/compression-using-canvas-and-png [ajaxian.com]
  • No, you have to encode it as ascii (or as latin1 if the other end of the transaction can be told about that).

    $ perl -MJSON::XS -MFile::Slurp -e '$g=read_file("add.gif"); print JSON::XS->new->ascii(1)->encode({file=>$g})' > json

    $ perl -MJSON::XS -MFile::Slurp -e '$g=read_file("json"); $d = decode_json($g); print $d->{file}' > gif

    $ diff add.gif gif
    $
    --

    -- ask bjoern hansen [askbjoernhansen.com], !try; do();

    • Encoding one property as ascii is portable? I didn't think JSON had a way to mark encoding for individual nodes.
      • I didn't read the ECMAScript spec, but according to JSON.org then \u[four hex digits] is a valid way to specify a "character", so yes - I think so. It's still unicode, but you "munge" it to not have any high bits.

        --

        -- ask bjoern hansen [askbjoernhansen.com], !try; do();