提取对象的属性值并将其用作字典键

时间:2016-03-07 22:17:48

标签: json dictionary jq

我输入的格式为:

[
  {
    "name":"Product one",
    "productId":"12345",
    "itemCode":"7037"
  },
  {
    "name":"Product two",
    "productId":"67890",
    "itemCode":"9101"
  },
  {
    "name":"Product three",
    "productId":"111213",
    "itemCode":"7047"
  }
]

对于数组中的每个对象,我想获取name属性的值,并将其用作结果对象的属性名称。我想要的输出是:

{
  "Product one": {
    "productId":"12345",
    "itemCode":"7037"
  },
  "Product two": {
    "productId":"67890",
    "itemCode":"9101"
  },
  "Product three": {
    "productId":"111213",
    "itemCode":"7047"
  }
}

这是我能够找到的最接近的地方:

.[] |  { (.name) : { productId: .productId, vendorId: .vendorId } }

这是产生的输出:

{
  "Product one": {
    "productId": "12345",
    "vendorId": null
  }
}
{
  "Product two": {
    "productId": "67890",
    "vendorId": null
  }
}
{
  "Product three": {
    "productId": "111213",
    "vendorId": null
  }
}

这会创建双嵌套产品,并且不会在它们之间包含空格。

感谢您提前提供任何帮助。

3 个答案:

答案 0 :(得分:1)

将数组转换为对象的最简单方法可以通过from_entries函数,如下所示:

map({key: .name, value: del(.name)}) | from_entries

答案 1 :(得分:1)

这里最简单的方法是在数组中创建三个对象,然后“添加”它们:

{
  "Product one": {
    "productId": "12345",
    "itemCode": "7037"
  },
  "Product two": {
    "productId": "67890",
    "itemCode": "9101"
  },
  "Product three": {
    "productId": "111213",
    "itemCode": "7047"
  }
}

输出:

{{1}}

答案 2 :(得分:0)

以下是使用 reduce

的解决方案
reduce .[] as $e (
     {}
   ; .[$e.name] = ($e | del(.name))
)