2017-02-22 69 views
3

入れ子オブジェクトからなるJSONをフラット化しようとしています。最上位層にはいくつかのキーと値のペアが含まれています。各値は、それ自体が複数のオブジェクト(最下層)の配列です。jqキー名を保持した状態でJSONをフラット化

jqを使用して、私が得たいと思っていたものは、ボトムレイヤーのすべてのオブジェクトを含むオブジェクトの配列です。各オブジェクトには、もともと属していたトップレイヤーのキーを識別するキー/値ペアが追加されています。すなわち

、Iは各OBJiは、単に余分なキー/値のペア

と元のオブジェクトである無地アレイ

[OBJ1, OBJ2, OBJ3] 

にJSON

{ 
"key1": [obj1, obj2], 
"key2": [obj3] 
} 

を入れたいです

"parent-key-name": keyx 

ここで、keyxはトップレイヤーのキー012すなわち、"key1"obj1obj2"key2"obj3です。

私は、最下位層のオブジェクトを参照するときに問題が発生することに苦労しています。 via [。]、jqは関連するトップレイヤー情報にアクセスするための組み込み機能を持っていないようです。しかし、私はjqの新機能であり、結局のところ簡単な解決策があることを願っています。

答えて

2

を考えると、次の入力:あなたは、エントリにあなたの項目を分割変数にキーを格納し、valueオブジェクト内の各項目に値を追加することができます

{ 
"key1": [{"name":"Emma"},{"name":"Bob"}], 
"key2": [{"name":"Jean"}] 
} 

jq '[ to_entries[] | .key as $parent | .value[] | 
    .["parent-key-name"] |= (.+ $parent) ] ' test.json 

います次の出力:

[ 
    { 
    "name": "Emma", 
    "parent-key-name": "key1" 
    }, 
    { 
    "name": "Bob", 
    "parent-key-name": "key1" 
    }, 
    { 
    "name": "Jean", 
    "parent-key-name": "key2" 
    } 
] 
+0

[to_entries [] | .keyとしての.key .value [] | 。["parent-key-name"] = $ parent] OR [to_entries [] | .keyとしての.key .value [] + {"親キー名":$ parent}] – peak

1

2つのステップから構成され、それぞれが個別に役立つ可能性があります。誰かが少し違った方法でJSONを "平坦化"したい場合、 。| .VALUEは[] | =(+ {「親キー$ Kなど

with_entries(.KEY:

  1. まずは、objに変更を加える[i]の "インプレース" しましょう-name ":$ K}))

例:

$ jq -n -c -f program.jq 

入力: { "KEY1":[{1}、{2}]、 "KEY2":[{B:3}]}

出力:

{ 
    "key1": [ 
    { 
     "a": 1, 
     "parent-key-name": "key1" 
    }, 
    { 
     "a": 2, 
     "parent-key-name": "key1" 
    } 
    ], 
    "key2": [ 
    { 
     "b": 3, 
     "parent-key-name": "key2" 
    } 
    ] 
} 
  • 単に上記フィルタに| [.[]]を追加し、平坦化します。

    [[{"a":1、 "親キー名": "key1"}、{"a":2、 "親キー名": "key1"}] [{"" b ":3、" parent-key-name ":" key2 "}]]

  • 関連する問題