2016-12-08 3 views
1

変換を試行していますJSONYAMLに変換しようとしています。PerlでJSON :: PP :: Booleanを0,1に変換すると便利です。

--- 
some: 
    - isFlagged: !!perl/scalar:JSON::PP::Boolean 1 
    name: Some name 
    - isFlagged: !!perl/scalar:JSON::PP::Boolean 0 
    name: Some other name 

私は0または1JSON::PP::Booleanオブジェクトを変換する必要があります。それが生成する。このコード

#!/usr/bin/env perl 

use 5.014; 
use warnings; 

use JSON; 
use YAML; 

my $json_string = q(
{ 
    "some" : [ 
     { "isFlagged" : true, "name" : "Some name" }, 
     { "isFlagged" : false, "name" : "Some other name" } 
    ] 
} 
); 

my $data = decode_json($json_string); 
say Dump($data); 

を持っています。もちろん、YAML出力から!!perl/scalar:JSON::PP::Boolean文字列をすべて削除することもできますが、これは正しい解決策ではないようです。

ので、簡単かつ正しい方法YAML

--- 
some: 
    - isFlagged: 1 
    name: Some name 
    - isFlagged: 0 
    name: Some other name 

答えて

5

使用YAMLのStringify optionを生成しますので、簡単な01にすべてJSON::PP::Booleanオブジェクトを変換するものである:

{ 
    local $YAML::Stringify = 1; 
    say Dump($data); 
} 

これはYAML使用しますオブジェクトの内部構造をダンプする代わりにJSON :: PP :: Booleanからオーバーロードされます。

+1

は私に 'JSON :: is_bool' – Zaid

+0

YESでそれをマッサージするの$ data''上の再帰的な歩行を行なう手間を節約からありがとうございます! :)それは私が欲しいものを正確に行います。ありがとうございました。 – cajwine

1

一般解:

use Carp qw(carp); 

sub convert_bools { 
    my %unrecognized; 

    local *_convert_bools = sub { 
     my $ref_type = ref($_[0]); 
     if (!$ref_type) { 
      # Nothing. 
     } 
     elsif ($ref_type eq 'HASH') { 
      _convert_bools($_) for values(%{ $_[0] }); 
     } 
     elsif ($ref_type eq 'ARRAY') { 
      _convert_bools($_) for @{ $_[0] }; 
     } 
     elsif (
       $ref_type eq 'JSON::PP::Boolean'   # JSON::PP 
      || $ref_type eq 'Types::Serialiser::Boolean' # JSON::XS 
     ) { 
      $_[0] = $_[0] ? 1 : 0; 
     } 
     else { 
      ++$unrecognized{$ref_type}; 
     } 
    }; 

    &_convert_bools; 

    carp("Encountered an object of unrecognized type $_") 
     for sort values(%unrecognized); 
} 

my $data = decode_json($json); 
convert_bools($data); 
+0

'JSON :: is_bool'を使わないのはなぜですか? – Zaid

+0

@Zaid、JSON.pmを使用するとうまくいくと思います。しかし、私はそのモジュールを使用しません.JSON :: XSの代わりにJSON :: PPにデフォルト設定する方法はエラーが起こりやすいので、JSONのいくつかのバージョンでのみ動作するように制限したくありませんでしたモジュール。 – ikegami

+0

たとえば、 'JSON :: is_bool'は、JSON :: PPとJSON :: XSの両方を使用するプロジェクトでは動作しません。 – ikegami

関連する問題