Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json jq:将对象数组转换为对象_Json_Bash_Translation_Jq - Fatal编程技术网

Json jq:将对象数组转换为对象

Json jq:将对象数组转换为对象,json,bash,translation,jq,Json,Bash,Translation,Jq,我收到curl的回复,格式如下: [ { "list": [ { "value": 1, "id": 12 }, { "value": 15, "id": 13 }, { "value": -4, "id": 14 } ] }, ... ] { "12": "newId1", "13": "n

我收到curl的回复,格式如下:

[
  {
    "list": [
      {
        "value": 1,
        "id": 12
      },
      {
        "value": 15,
        "id": 13
      },
      {
        "value": -4,
        "id": 14
      }
    ]
  },
  ...
]
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
}
.[].list |= reduce .[] as $i ({};
    ($i.id|tostring) as $k
      | (select($mapping | has($k))[$mapping[$k]] = $i.value) // .
)
给定ID之间的映射,如下所示:

[
  {
    "list": [
      {
        "value": 1,
        "id": 12
      },
      {
        "value": 15,
        "id": 13
      },
      {
        "value": -4,
        "id": 14
      }
    ]
  },
  ...
]
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
}
.[].list |= reduce .[] as $i ({};
    ($i.id|tostring) as $k
      | (select($mapping | has($k))[$mapping[$k]] = $i.value) // .
)
我想说:

[
  {
    "list": {
      "newId1": 1,
      "newId2": 15,
      "newId3": -4,
    }
  },
  ...
]
这样我就得到了从ID到值的映射(在这一过程中,我希望重新映射ID)

我已经在这方面工作了一段时间了,每次我都会遇到死路一条

注:如有必要,我可以使用Shell或类似产品来预成型环

编辑:以下是我目前开发的一个版本:

jq '[].list.id = ($mapping.[] | select(.id == key)) | del(.id)' -M --argjson "mapping" "$mapping"

我不认为这是最好的,但我想看看是否能找到一个更接近我需要的旧版本。

[编辑:下面的回答是对问题的回答,它描述了(a)如下所示的映射,以及(b)具有表单的输入数据:

[
  {
    "list": [
      {
        "value": 1,
        "id1": 12
      },
      {
        "value": 15,
        "id2": 13
      },
      {
        "value": -4,
        "id3": 14
      }
    ]
  }
]
编辑结束]

在下文中,我将假设映射通过以下函数可用,但这是一个无关紧要的假设:

def mapping: {
  "id1": "newId1",
  "id2": "newId2",
  "id3": "newId3"
} ;
def mapping:
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
} ;


map( .list
     |= (map( mapping[.id|tostring] as $mapped
              | select($mapped)
              |  {($mapped): .value} )
         | add) )
然后,以下jq滤波器将产生所需的输出:

map( .list
     |= (map( to_entries[]
              | (mapping[.key]) as $mapped
              | select($mapped)
              | {($mapped|tostring): .value} )
         | add) )

剥猫皮的方法很多。我会这样做:

[
  {
    "list": [
      {
        "value": 1,
        "id": 12
      },
      {
        "value": 15,
        "id": 13
      },
      {
        "value": -4,
        "id": 14
      }
    ]
  },
  ...
]
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
}
.[].list |= reduce .[] as $i ({};
    ($i.id|tostring) as $k
      | (select($mapping | has($k))[$mapping[$k]] = $i.value) // .
)
您只需通过单独的文件或参数提供映射

$ cat program.jq
.[].list |= reduce .[] as $i ({};
    ($i.id|tostring) as $k
      | (select($mapping | has($k))[$mapping[$k]] = $i.value) // .
)

$ cat mapping.json
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
}

$ jq --argfile mapping mapping.json -f program.jq input.json
[
  {
    "list": {
      "newId1": 1,
      "newId2": 15,
      "newId3": -4
    }
  }
]

这是一个修正后的问题的免还原解决方案

在下文中,我将假设映射通过以下函数可用,但这是一个无关紧要的假设:

def mapping: {
  "id1": "newId1",
  "id2": "newId2",
  "id3": "newId3"
} ;
def mapping:
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
} ;


map( .list
     |= (map( mapping[.id|tostring] as $mapped
              | select($mapped)
              |  {($mapped): .value} )
         | add) )

“选择”是为了安全(即,它检查所考虑的.id是否确实映射)。通过在第3行写入
{($mapped | tostring):.value}

来确保
$mapped
是一个字符串也是合适的,
.key
=0、1或2不是吗?映射变量中的索引不总是未定义的吗。我成功了!非常感谢,我已经为此挣扎了几个小时。@user2752635-有人改变了问题,所以我添加了一个单独的回答。