16

科学機器によって作成された階層的に深い JSON オブジェクトがあるため、ファイルがやや大きく (1.3 MB)、人間が簡単に読み取ることができません。JSON オブジェクトの特定の深さまでのキーのリストを取得したいと考えています。たとえば、このような入力オブジェクトが与えられた場合

{
    "acquisition_parameters": {
        "laser": {
            "wavelength": {
                "value": 632,
                "units": "nm"
            }
        },
        "date": "02/03/2525",
        "camera": {}
    },
    "software": {
        "repo": "github.com/username/repo",
        "commit": "a7642f",
        "branch": "develop"
    },
    "data": [{},{},{}]
}

このような出力が欲しいです。

{
    "acquisition_parameters": [
        "laser",
        "date",
        "camera"
    ],
    "software": [
        "repo",
        "commit",
        "branch"
    ]
}

これは主に、JSON オブジェクトの内容を列挙できるようにするためのものです。計測器からの JSON オブジェクトを処理した後、分岐が始まります。たとえば、 のようなフィールドを持つものもあれば、 を.frame.cross_section.stats.fwhm持つものもある.sample.speciesため、コマンド ラインで JSON オブジェクトを問い合わせることができれば便利です。

4

3 に答える 3

12

以下はまさにあなたが望むことをするべきです

jq '[(keys - ["data"])[] as $key | { ($key): .[$key] | keys }] | add'

これにより、上記の入力を使用して、次の出力が得られます。

{
  "acquisition_parameters": [
    "camera",
    "date",
    "laser"
  ],
  "software": [
    "branch",
    "commit",
    "repo"
  ]
}
于 2015-02-11T03:10:43.707 に答える
6

目的を考えると、ビルトインを使用しpathsて入力内のすべてのパスをリストし、目的の深さで切り捨てる方が簡単な場合があります。

$  echo '{"a":{"b":{"c":{"d":true}}}}' | jq -c '[paths|.[0:2]]|unique'
[["a"],["a","b"]]
于 2014-06-19T06:49:19.990 に答える