首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jq :如何通过jq更新json的值?

jq :如何通过jq更新json的值?
EN

Stack Overflow用户
提问于 2015-11-16 13:53:48
回答 2查看 140关注 0票数 1

我有一个如下的json文件:

代码语言:javascript
复制
{"users":{"347793":"user1"}}
{"users":{"6560536":"user2"}}
{"users":{"6637901":"user3"}}
{"users":{"5850517":"user4"}}
{"users":{"2907509":"user5"}}
{"users":{"6611743":"user6"}}
{"users":{"6535592":"user7"}}
{"users":{"5586286":"user8"}}
{"users":{"2484439":"user9"}}
{"messages":{"id":"id1","owner":{"id":"347793","type":"user"},"otherUser":{"id":"6560536","type":"user"}}}
{"messages":{"id":"id2","owner":{"id":"6637901","type":"user"},"otherUser":{"id":"6560536","type":"user"}}}
{"messages":{"id":"id3","owner":{"id":"2907509","type":"user"},"otherUser":{"id":"2484439","type":"user"}}}
{"messages":{"id":"id4","owner":{"id":"347793","type":"user"},"otherUser":{"id":"2907509","type":"user"}}}
{"messages":{"id":"id5","owner":{"id":"5850517","type":"user"},"otherUser":{"id":"5850517","type":"user"}}}
{"messages":{"id":"id6","owner":{"id":"5586286","type":"user"},"otherUser":{"id":"347793","type":"user"}}}

我想要得到这样的输出文件,将所有者的类型更改为用户名:

代码语言:javascript
复制
{"users":{"347793":"user1"}}
{"users":{"6560536":"user2"}}
{"users":{"6637901":"user3"}}
{"users":{"5850517":"user4"}}
{"users":{"2907509":"user5"}}
{"users":{"6611743":"user6"}}
{"users":{"6535592":"user7"}}
{"users":{"5586286":"user8"}}
{"users":{"2484439":"user9"}}
{"messages":{"id":"id1","owner":{"id":"347793","type":"user1"},"otherUser":{"id":"6560536","type":"user2"}}}
{"messages":{"id":"id2","owner":{"id":"6637901","type":"user3"},"otherUser":{"id":"6560536","type":"user2"}}}
{"messages":{"id":"id3","owner":{"id":"2907509","type":"user5"},"otherUser":{"id":"2484439","type":"user9"}}}
{"messages":{"id":"id4","owner":{"id":"347793","type":"user1"},"otherUser":{"id":"2907509","type":"user5"}}}
{"messages":{"id":"id5","owner":{"id":"5850517","type":"user4"},"otherUser":{"id":"5850517","type":"user4"}}}
{"messages":{"id":"id6","owner":{"id":"5586286","type":"user8"},"otherUser":{"id":"347793","type":"user10"}}}

我不知道这样做,我尝试了一些代码,但它不工作。

代码语言:javascript
复制
jq -c '.messages[] as $message| $message.owner.type|=.users[]|select(.id==$message.owner.id).name'
EN

回答 2

Stack Overflow用户

发布于 2015-11-17 05:28:43

如果“消息”的数量非常大,那么单独处理每个消息可能会更好,以避免将它们全部读取到内存中。

无论如何,下面说明了如何使用jq读入一个文件以构造字典,并逐行处理第二个文件。

假设我们已经将JSON划分为两个文件(users.json和messages.json),并且以下代码行在process.jq中:

代码语言:javascript
复制
# Apply f to composite entities recursively, and to atoms
def walk(f):
  . as $in
  | if type == "object" then
      reduce keys[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

($users | map(.users) | add) as $dict
| walk(if type == "object" and .type == "user"
       then .type = $dict[.id]
       else .
       end)

(如果您的jq已经有walk/1,那么可以省略它的定义。)

然后,可以使用以下命令来处理消息:

代码语言:javascript
复制
$ jq --slurpfile users users.json -f process.jq messages.json
票数 1
EN

Stack Overflow用户

发布于 2015-11-16 16:25:17

你的数据没有结构,如果你给它一些,它会更容易。

代码语言:javascript
复制
{ users: map(.users // empty), messages: map(.messages // empty) }

当你用这段代码吞噬这个文件时,它会给你这个:

代码语言:javascript
复制
{
  "users": [
    { "347793": "user1" },
    { "6560536": "user2" },
    { "6637901": "user3" },
    { "5850517": "user4" },
    { "2907509": "user5" },
    { "6611743": "user6" },
    { "6535592": "user7" },
    { "5586286": "user8" },
    { "2484439": "user9" }
  ],
  "messages": [
    {
      "id": "id1",
      "owner": { "id": "347793", "type": "user" },
      "otherUser": { "id": "6560536", "type": "user" }
    },
    {
      "id": "id2",
      "owner": { "id": "6637901", "type": "user" },
      "otherUser": { "id": "6560536", "type": "user" }
    },
    {
      "id": "id3",
      "owner": { "id": "2907509", "type": "user" },
      "otherUser": { "id": "2484439", "type": "user" }
    },
    {
      "id": "id4",
      "owner": { "id": "347793", "type": "user" },
      "otherUser": { "id": "2907509", "type": "user" }
    },
    {
      "id": "id5",
      "owner": { "id": "5850517", "type": "user" },
      "otherUser": { "id": "5850517", "type": "user" }
    },
    {
      "id": "id6",
      "owner": { "id": "5586286", "type": "user" },
      "otherUser": { "id": "347793", "type": "user" }
    }
  ]
}

那么做替换应该更容易些。

代码语言:javascript
复制
(.users | add) as $users
    | (.messages[].owner |= (.type = $users[.id]))
    | (.messages[].otherUser |= (.type = $users[.id]))

然后,如果您出于任何原因想要返回到您的其他结构,那么它应该很容易(但我不建议这样做)。

代码语言:javascript
复制
{ users: .users[] }, { messages: .messages[] }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33729261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档