json - 通过通用键值对组合 JSON
问题描述
我目前正在解决一个问题,但似乎无法解决这个问题。这里有一些数据,所以你知道我在下面说什么:
foo.json
{
"Schedule": [
{
"deviceId": 123,
"reservationId": 123456,
"username": "jdoe"
},
{
"deviceId": 456,
"reservationId": 589114,
"username": "jsmith"
}
],
"serverTime": 1522863125.019958
}
bar.json
[
{
"a": {
"b": "10.0.0.1",
"c": "hostname1"
},
"deviceId": 123
},
{
"a": {
"b": "10.0.0.2",
"c": "hostname2"
},
"deviceId": 456
}
]
foobar.json
{
"Schedule": [
{
"deviceId": 123,
"reservationId": 123456,
"username": "jdoe",
"a": {
"b": "10.0.0.1",
"c": "hostname1"
}
}
},
{
"deviceId": 456,
"reservationId": 789101,
"username": "jsmith",
"a": {
"b": "10.0.0.2",
"c": "hostname2"
}
}
],
"serverTime": 1522863125.019958
}
我正在尝试使用 jq 来执行此操作,并从这篇文章中获得了一些帮助:https ://github.com/stedolan/jq/issues/1090 目标是能够组合 JSON,使用一些键作为常见文件之间的点。数据可以嵌套任意数量的级别。在这种情况下,foo.json 的嵌套数据只有两级深,但需要与嵌套 1 级深的数据相结合。
任何和所有建议都会非常有帮助。如果需要,我也很乐意澄清和回答问题。谢谢!
解决方案
使用 foobar.jq 如下:
def dict(f):
reduce .[] as $o ({}; .[$o | f | tostring] = $o ) ;
($bar | dict(.deviceId)) as $dict
| .Schedule |= map(. + ($dict[.deviceId|tostring] ))
调用:
jq -f foobar.jq --argfile bar bar.json foo.json
产生如下所示的输出。
请注意,字典中的引用对象包含完整的对象(包括“deviceId”的键/值对),但由于jq 中定义del(.deviceId)
了方式,因此没有必要这样做。+
输出
{
"Schedule": [
{
"deviceId": 123,
"reservationId": 123456,
"username": "jdoe",
"a": {
"b": "10.0.0.1",
"c": "hostname1"
}
},
{
"deviceId": 456,
"reservationId": 589114,
"username": "jsmith",
"a": {
"b": "10.0.0.2",
"c": "hostname2"
}
}
],
"serverTime": 1522863125.019958
}
推荐阅读
- amazon-redshift - 如何在一个组内的列中使用多个十进制数字?
- python - 比较日期的列表表示或比较日期时间对象的实用性
- typescript - 如何使用 Typescript 正确转换模拟函数
- macos - SwiftUI 菜单按钮最初显示为禁用
- java - 多对多关系中 MAX id GROUP BY FOREIGN KEY 的 JPA 标准
- javascript - VueJS 正在更新事件中的另一个元素
- javascript - 在“for...in”语句中应用过滤器
- php - 将php变量转换为Excel
- c++ - 了解关于 EMC++ 第 41 项的勘误表的评论
- symfony - 当用户关闭浏览器时向数据库发出请求