使用 Jolt Spec 如何通过使用键反向减少字典列表

Using Jolt Spec how to reverse reduce a list of dictionary by a key using

使用下面的代码,我能够通过一个键映射字典列表

import json

values_list = [{"id" : 1, "user":"Rick", "title":"More JQ"}, {"id" : 2, "user":"Steve", "title":"Beyond"}, {"id" : 1, "user":"Rick", "title":"Winning"}]
result      = {}

for data in values_list:
  id    = data['id']
  user  = data['user']
  title = data['title']
  if id not in result:
    result[id] = {
    'id' : id,
    'user' : user,
    'books' : {'titles' : []}
    }
  result[id]['books']['titles'].append(title)

print(json.dumps((list(result.values())), indent=4))

知道 Jolt 规范有多干净,并尝试在代码之外分离模式。 有没有办法使用 Jolt Spec 来达到相同的结果。

结果

[
  {
    "id": 1,
    "user": "Rick",
    "books": {
      "titles": [
        "More JQ",
        "Winning"
      ]
    }
  },
  {
    "id": 2,
    "user": "Steve",
    "books": {
      "titles": [
        "Beyond"
      ]
    }
  }
]

您可以使用三个级别的连续规格

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "@(1,id).&",
        "title": "@(1,id).books.&s[]"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": ""
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "*": {
        "id": "ONE",
        "user": "ONE"
      }
    }
  }
]
  • 在第一个规范中,常见的 id 值由 "@(1,id)." 表达式组合
  • 在第二个规范中,删除了最外层对象的整数键(1,2)
  • 在上一个规范中,只选择了第一个重复元素