【问题标题】:Use JQ to extract an array of paths and also replace those values by it own path使用 JQ 提取路径数组并用它自己的路径替换这些值
【发布时间】:2020-01-10 01:12:30
【问题描述】:

如果 JQ 能够以简单的方式做到这一点,我想知道,但在转向其他工具之前,我想问问这里的专家。

我将收到一个包含需要提取的 JSON 路径的数组。

那些被选中的键和它们的值,会生成一个属性文件,并且也会在 JSON 本身中被替换。

例子:

INPUT ARGS: "description" "assets.url"
^^^ 如果这样更容易处理数组,我们可以将此 INPUT 格式更改为 assets[].url ^^^

JSON:

 {
        "title": "TEST TITLE",
        "description": "TEST DESCRIPTION",
        "type": "Promo",
        "assets": [{
           "content_type": "image",
           "url": "https://www.fakesite.com/image.jpg"
           }, {
           "content_type": "image",
           "url": "https://www.fakesite.com/image2.jpg"
        }]
    }

预期输出:

1) 一个属性文件(key=value)

description=TEST DESCRIPTION
assets_0_url=https://www.fakesite.com/image.jpg
assets_1_url=https://www.fakesite.com/image2.jpg

2) 转换后的 JSON 文件

 {
        "title": "TEST TITLE",
        "description": "${description}",
        "type": "Promo",
        "assets": [{
           "content_type": "image",
           "url": "${assets_0_url}"
           }, {
           "content_type": "image",
           "url": "${assets_1_url}"
        }]
    }

OUTPUT 键(在本例中:description、assets_0_url、assets_1_url)不需要遵循这种格式,但在数组的情况下需要编号且唯一。

唯一的要求是 OUTPUT 属性文件的键与 OUTPUT JSON 中的替换值匹配。

财产:

描述=测试描述

JSON:

"description": "${description}",

到目前为止我所做的:

FIELDS="description\|assets.*url"
OUTPUT=$(jq -r 'paths(scalars) as $p | "\($p|join("_"))=\(getpath($p))"' $FILE | grep $FIELDS)
printf "%s\r" "$OUTPUT" > json.properties

这给了我以下 json.properties 文件:

description=TEST DESCRIPTION
assets_0_url=https://www.fakesite.com/image.jpg
assets_1_url=https://www.fakesite.com/image2.jpg

JQ 可以吗?

提前致谢

【问题讨论】:

  • 您在此处给出的特定属性文件格式是否有原因,或者是否有任何方式使用来自一个 JSON 文件的内容来填写不同的文件?跨度>
  • (虽然任何一种方法都是可能的,但将包含"url": "${assets_0_url}" 的输入文件改为包含"url": .assets[0].url 会容易得多——也就是说,让输入是 jq 源代码而不是 JSON 本身;那么您根本不需要中间属性格式)。
  • ...或者是 (3) 示例输出,这意味着您要将 values 映射回 keys?这也是可行的,但如果这是您想要的,那么可能应该对问题进行编辑以使其清晰明了。
  • 嗨,我可以将输入更改为任何格式,无论哪种更简单,我只需要将这些值提取到属性文件中(我也不需要遵循键名模式,但我需要使确保数组已编号且唯一),并且需要用属性文件中的相同键名模式替换那些提取的 JSON 值。 Idk 如果我能够澄清大声笑,谢谢
  • 您能否edit 明确标记哪些代码示例是输入,哪些是输出,哪些特定组件可以更改,哪些不能更改?在某一时刻,问题文本说属性是输入的;但如果这是真的,那么输入可以更改为任何格式的声明和必须使用属性文件(而不是任何其他格式)的声明是相互冲突的。

标签: bash path jq


【解决方案1】:

以下解决了大部分要求,但将“INPUT ARGS”的解析留作练习。

属性文件

def propertyValue(property):
  "\(property)=\(.[property])";

def propertyValue(arrayvaluedproperty; property):
  .[arrayvaluedproperty] as $a
  | range(0; $a|length) as $i
  | "\(arrayvaluedproperty)_\($i)_\(property)=\($a[$i][property])";

propertyValue("description"),
propertyValue("assets"; "url")

转换后的 JSON

def updateProperty(p):
  .[p] = "${\(p)}";

def updateProperty(arrayvaluedproperty; p):
  .[arrayvaluedproperty] as $a
  | reduce range(0; $a|length) as $i (.;
    .[arrayvaluedproperty][$i] = "${\(arrayvaluedproperty)_\($i)_\(p)}");


updateProperty("description")
| updateProperty("assets"; "url")

【讨论】:

    猜你喜欢
    • 2022-07-14
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多