2016-11-24 4 views
0

以下の構造を持つ与えられたjsonファイルをデコードしたいと思います。私の問題は、これを私がスライスとキーコンフリクトを持っているperlにデコードすると以下のようになります。冗長要素を上書きしないjsonのデコードからハッシュ構造を取得する方法はありますか?私は配列を考えることができる、任意のアイデアや提案は大歓迎です。Perl JSON与えられたjsonファイルをデコード中にキーの上書きを処理する方法

"register": { 

    "name"  : "CTRL", 
    "desc"  : "Control Register 1", 
    "mode"  : "rw", 
    "reset_value": "0x0000_0000", 
    "addr_offset": "+0x4", 

    "slice": { 
     "name": "Reserved", 
     "msb" : 3, 
     "lsb" : 2, 
     "desc": "Reserved. Leave 0." 
    }, 

    "slice": { 
     "name": "en", 
     "msb" : 1, 
     "lsb" : 1, 
     "desc": "Port enable" 
    }, 

    "slice": { 
     "name": "Lbm", 
     "msb" : 0, 
     "lsb" : 0, 
     "desc": "Loop back mode" 
    } 

    }, 
+0

オブジェクトをperlにどのようにデコードするのかは不明ですか?それについて詳述できますか? – rics

+2

あなたの問題はそれが適切なJSONではないということです。キーは一意でなければなりません。キーを複製するのではなく、匿名のハッシュの配列が必要です – beasy

答えて

5

JSON spec

によると、オブジェクト内の名前は一意でなければなりません。

「正しい」回答は、重複するキーでJSONを実行しないでください。配列を使用します。

{ 
    "register": { 
    "name":  "CTRL", 
    "desc":  "Control Register 1", 
    "mode":  "rw", 
    "reset_value": "0x0000_0000", 
    "addr_offset": "+0x4", 
    "slices": [ 
     { 
     "name": "Reserved", 
     "msb": 3, 
     "lsb": 2, 
     "desc": "Reserved. Leave 0." 
     }, 
     { 
     "name": "en", 
     "msb": 1, 
     "lsb": 1, 
     "desc": "Port enable" 
     }, 
     { 
     "name": "Lbm", 
     "msb": 0, 
     "lsb": 0, 
     "desc": "Loop back mode" 
     } 
    ] 
    } 
} 

この

は、perlでデコードします:

my $stuff = decode_json(
    do { local $/; <$input> } 
); 

print Dumper $stuff; 

をとして反復:あなたは本当に、あなたがJSONincremental parsing

を利用することができるかもしれないしなければならない場合は

foreach my $slice (@{$stuff -> {register} -> {slices}}) { 
    print Dumper $slice; 
} 

関連する問題