我正在使用两个JSON文件: dest_sr.json和src_templates.json
我想创建一个新的JSON对象,它将来自JSON对象#1 (特别是Template_SR键)和JSON对象#2 ( Template_Name和Template_ID键)的键组合在一起,但前提是在Pool_ID上找不到与对象#1和对象#2都匹配的VM模板
对于两个给定的JSON对象: dest_sr.json:
{
"Type": "pool",
"Pool_ID": "adb58e84",
"Template_SR": "fc820294"
}
{
"Type": "pool",
"Pool_ID": "d2dea684",
"Template_SR": "313f2a07"
}src_templates.json:
{
"Type": "VM-template",
"Template_Name": "CentOS 7 CloudInit V1",
"Template_ID": "9b1833a3",
"Pool_ID": "adb58e84"
}我想创建一个新的JSON对象,如下所示:
{
"Template_ID",:"9b1833a3",
"Template_SR":"313f2a07",
"Template_Name":"CentOS 7 CloudInit V1",
}使用Stackoverflow,我能够从示例中拼凑出一个hashJoin,它在.Pool_ID属性上执行hashJoin以创建一个新对象:
# hashJoin(a1; a2; field) expects a1 and a2 to be arrays of JSON objects
# and that for each of the objects, the field value is a string.
# A relational join is performed on "field".
def hashJoin(a1; a2; field):
# hash phase:
(reduce a1[] as $o ({}; . + { ($o | field): $o } )) as $h1
| (reduce a2[] as $o ({}; . + { ($o | field): $o } )) as $h2
# join phase:
| reduce ($h1|keys[]) as $key
([]; if $h2|has($key) then . + [ $h1[$key] + $h2[$key] ] else . end) ;
hashJoin( $file1; $file2; .Pool_ID)[]当我调用JQ来执行hashJoin时,我得到了一个新对象,如下所示:
/tmp $ jq -nc --slurpfile file1 /tmp/dest_sr.json --slurpfile file2 /tmp/src_templates.json -f hashJoinSimple.jq
{
"Type":"VM-template",
"Pool_ID":"adb58e84",
"Template_SR":"fc820294",
"Template_Name":"CentOS 7 CloudInit V1",
"Template_ID":"9b1833a3"
}有没有什么办法可以让我的合并代码使对象看起来像这样?
{
"Type":"VM-template",
"Pool_ID":"d2dea684",
"Template_SR":"fc820294",
"Template_Name":"CentOS 7 CloudInit V1",
"Template_ID":"9b1833a3"
}发布于 2021-03-09 08:59:52
我认为考虑到您的特定输入和期望的结果,我不认为散列是必要的。似乎您所需要做的就是从dest_sr.json中选择与src_templates.json中的id不匹配的输入,然后将其与模板中所需的值组合在一起。
$ jq --argfile template src_templates.json '
select(.Pool_ID != $template.Pool_ID) + ($template|{Template_Name,Template_ID})
' dest_sr.jsonhttps://stackoverflow.com/questions/66538285
复制相似问题