【发布时间】: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 明确标记哪些代码示例是输入,哪些是输出,哪些特定组件可以更改,哪些不能更改?在某一时刻,问题文本说属性是输入的;但如果这是真的,那么输入可以更改为任何格式的声明和必须使用属性文件(而不是任何其他格式)的声明是相互冲突的。