Commit | Line | Data |
dd1bf371 |
1 | use strictures 1; |
2 | |
3 | package JSON::Diffable; |
4 | |
5 | use JSON (); |
6 | use Exporter 'import'; |
7 | |
8 | my $real = JSON->new->allow_nonref->utf8; |
9 | |
10 | our @EXPORT_OK = qw( encode_json ); |
11 | |
12 | sub encode_json { |
13 | my $data = shift; |
14 | return _encode($data, 0); |
15 | } |
16 | |
17 | sub _indent { |
18 | my $str = shift; |
19 | $str =~ s{^}{ }gm; |
20 | return $str; |
21 | } |
22 | |
23 | sub _encode { |
24 | my $data = shift; |
25 | if (ref $data eq 'HASH') { |
26 | return sprintf "{\n%s}", |
27 | join '', |
28 | map { |
29 | my $key = $real->encode($_); |
30 | my $data = _encode($data->{$_}); |
31 | _indent("$key: $data") . ",\n"; |
32 | } |
33 | sort keys %$data; |
34 | } |
35 | elsif (ref $data eq 'ARRAY') { |
36 | return sprintf "[\n%s]", |
37 | join '', |
38 | map { |
39 | _indent(_encode($_)) . ",\n"; |
40 | } |
41 | @$data; |
42 | } |
43 | else { |
44 | return $real->encode($data); |
45 | } |
46 | } |
47 | |
48 | 1; |