in reply to Re: Write json structure to a file
in thread Write json structure to a file

It works now but I get data_out file with wrong order of structure fields - the first field is num_page, not title. Is it possible to make it constant?

Replies are listed 'Best First'.
Re^3: Write json structure to a file
by Corion (Patriarch) on Aug 13, 2015 at 12:22 UTC

    No. Perl hashes have no order, so the sequence in which hash keys are serialized is more or less random.

    Update: Note that Javascript does not define an order over the properties of objects either, so there is very little guarantee that a JSON document will have the keys in a specific order. It seems that ECMAscript 6 standardizes somewhat on "insertion order".

    The JSON definition declares that

    An object is an unordered set of name/value pairs.

    So, for hashes, JSON does not specify an order of the keys.

Re^3: Write json structure to a file
by MidLifeXis (Monsignor) on Aug 13, 2015 at 13:32 UTC

    If you wish it to be ordered in your output (more for human consumption), look at the JSON Documentation at the canonical option.

    Update: fixed link (Your Mother)

    --MidLifeXis

Re^3: Write json structure to a file
by anonymized user 468275 (Curate) on Aug 13, 2015 at 12:34 UTC
    ++Corion, and so if you want ordered pairs (same rules for json as Perl), the most obvious treatment is to replace that hash with an array of little hashes, e.g.:
    use strict; use warnings; binmode STDOUT, ":utf8"; use utf8; use JSON; my $json ={ 'book' => [ {'title' => 'smth'}, {'num_page' => 234} ] }; open my $fh, ">", "data_out.json"; print $fh encode_json($json); close $fh;
    Alternatively, you could sort the hash keys on the receiving end in Javascript into a particular order (put the key names in another hash with the sort positions as values for use in a sort function in Javascript) but that would be outside the scope of the monastery.

    One world, one people

      Hi! I'm getting this error while using binmode STDOUT, ":utf8". Please help! :)

      Failed to require abc.pm because Can't locate object method "BINMODE" via package "OutputTee" at /home/perl.abc.pm line 33.

        Your package OutputTee does seem to implement a tied filehandle but seems to not properly implement the BINMODE method.

        You will have to fix OutputTee.pm to do the right thing. Likely, that is calling binmode on all its filehandles:

        sub BINMODE { my( $self, @args ) = @_; binmode $self->{fh1}, @args; binmode $self->{fh2}, @args; }
        Can't locate object method "BINMODE"

        binmode is a function, so it should be in lowercase.

        $ perl -e 'binmode STDOUT, ":utf8";' $ perl -v This is perl 5, version 20, subversion 3 (v5.20.3) built for x86_64-li +nux-thread-multi (with 16 registered patches, see perl -V for more detail) Copyright 1987-2015, Larry Wall Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5 source ki +t. Complete documentation for Perl, including FAQ lists, should be found +on this system using "man perl" or "perldoc perl". If you have access to + the Internet, point your browser at http://www.perl.org/, the Perl Home Pa +ge. $

        Does the first command work for you? If not, run the second and see how old your perl is.

        If the first command does work for you (ie. doesn't throw an error) then you'll have to provide an SSCCE to illustrate the precise circumstance of your problem. (and probably start a new topic since it's not really specific to JSON anymore)