【问题标题】:jq: generate JSON: dynamic key creation possible?jq:生成 JSON:可以创建动态密钥吗?
【发布时间】:2016-02-16 02:48:14
【问题描述】:

我从来没有使用过 jq 来生成 JSON,只是解析。所以这对我来说是未曾走过的领域。

我找到了jq & bash: make JSON array from variable,这让我更接近于我正在寻找的东西。但是,我还没有确定如何为我正在寻找的结构动态创建键名。

我正在寻找的结构看起来像这样:

{
  "eth0":
        {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        },
  "eth3":
        {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        }
}

源自 csv:

iface,key1,key2,key3
eth0,value1,value2,value3
eth3,value1,value2,value3

我遇到的问题是从 CSV 动态生成 JSON 中的键。我还没有找到 jq 这样做的能力。我正在使用 jq 1.5。

我在这上面旋转我的轮子吗?

编辑 - 可能的答案

目前正在调查这个食谱答案:

https://github.com/stedolan/jq/wiki/Cookbook#convert-a-csv-file-with-headers-to-json

【问题讨论】:

    标签: bash variables jq


    【解决方案1】:

    理想情况下,您的输入应该是 JSON,因此您应该通过可以将 CSV 文件转换为包含您的数据的数组来运行文件,以便 jq 使用它。假设您的数据不复杂并且值本身不包含逗号,您可以读取原始行并将它们拆分。那么这只是建立你的结果的问题。

    $ jq -R 'split(",") as $k |
        reduce (inputs | split(",")) as $r ({};
            .[$r[0]] = ([range(1;$k|length) | { key: $k[.], value: $r[.] }] | from_entries)
        )' input.csv
    

    【讨论】:

    • 鉴于我的数据非常简单,我已将其标记为答案。它工作得很好,虽然我需要稍微改变我的 csv,但那是我的事。非常感谢这个答案。另一个可能的答案(在我的编辑中)也是正确的方向,但是,我正在使用这个答案,因为它更简洁并且适用于我的用例。
    【解决方案2】:

    这是一个简单的解决方案,实际上与 Jeff 的非常相似(特别是,它对 CSV 做出了相同的假设),但它在第一行使用 input,在其余行使用 inputs,这是一个简化的jq Cookbook 中的“objectify”版本,以及主过滤器中的 add 而不是 reduce

    jq -R -n '
      def objectify(headers): . as $in
        | reduce range(0; headers|length) as $i
            ({}; .[headers[$i]] = $in[$i]  );
    
      ((input|split(","))[1:]) as $headers
      | [ (inputs|split(",")) as $line
          | { ($line[0]): ($line[1:] | objectify($headers)) } ]
      | add
    '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2021-06-18
      • 1970-01-01
      • 2018-03-23
      • 2018-07-28
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多