我目前正在处理一个问题,似乎无法解决这个问题。这是一些数据,所以你知道我在下面谈论的内容:
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级深度的数据相结合。
任何和所有建议都会非常有用。如果需要,我也很乐意澄清并回答问题。谢谢!
答案 0 :(得分: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
产生如下所示的输出。
请注意,字典中的指示对象包含完整对象(包括#34; deviceId"的键/值对),但由于这种方式,del(.deviceId)
不需要它+
在jq。
{
"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
}