我有数千个 JSON 文件,我想将它们合并到一个对象中。这些都不是相似的格式。让我详细解释一下。这是 JSON 的第一个示例
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
}
]
和其他类型不相似,就像下面有很少的公共字段和其他字段
[
{
"value 3": 300,
"value 4": 400,
"value 5": 500,
"value 6": 600
}
]
例如我有 2 个具有第一个示例格式的文件和一个具有第二个示例格式的文件。我正在尝试用于jq
合并它。
jq -s '.' *.json > myfile.json
它使用三个不同的对象返回以下内容
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
}
],
[
{
"value 1": 10,
"value 2": 20,
"value 3": 30,
"value 4": 40
}
],
[
{
"value 3": 300,
"value 4": 400,
"value 5": 500,
"value 6": 600
}
]
我需要将其合并到一个对象中,如下所示,以及是否有任何jq
选项可以排除那些具有特定字段的文件。比如排除那些具有该字段的文件"value 6"
。所以最终 JSON 输出将是
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
},
{
"value 1": 10,
"value 2": 20,
"value 3": 30,
"value 4": 40
}
]
答案1
您可以inputs
对所有 JSON 文件的内容一起应用过滤器并应用选择过滤器。该-n
标志用于确保输出 JSON 是根据给定输入从头开始构建的。
jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json
通过这样做jq -n 'inputs[]'
,所有组成 JSON 文件中的所有对象都可供 select 函数使用,该函数会丢弃任何包含关键字段的对象"value 6"
。过滤[..]
器周围放置的是数组中的最终结果对象。
另一种方法是使用reduce()
函数以迭代方式添加所需的对象
jq -n 'reduce inputs[] as $data (.; . + [ if $data | has("value 6") | not then $data else empty end ] )'
答案2
我使用 Node.js 创建了一个命令行工具来在本地合并嵌套的 json 文件。
https://github.com/divyeshmakwana96/injson
您可以使用!include('./path-to-json/item1.json')
语句嵌入另一个 json 文件的内容。子 json 文件也可以有 include 语句。
例子:
{
"pi": 3.141,
"happy": true,
"questions:": [
"!include('./questions/item1.json')",
"!include('./questions/item2.json')"
],
"answer": "!include('./answers/item1.json')"
}