разделение JSON на два разных объекта с использованием идентификатора - PullRequest
0 голосов
/ 20 марта 2020

У меня есть JSON, который выглядит следующим образом:

[
   {
      "username": "saurabhu",
      "tenant_name": "abc_c1e3e096-6e95-4b84",
      "project_domain_name": "aa",
      "user_domain_name": "aa",
      "password": "saurabhp",
      "roles": [
         "admin"
      ]
   },
   {
      "username": "saurabhu",
      "tenant_name": "def_c1e3e096-6e95-4b84",
      "project_domain_name": "aa",
      "user_domain_name": "aa",
      "password": "saurabhp",
      "roles": [
         "ResellerAdmin",
         "heat_stack_owner",
         "Member"
      ]
   },
   {
      "username": "saurabhu",
      "tenant_name": "c_c1e3e096-6e95-4b84",
      "project_domain_name": "aa",
      "user_domain_name": "aa",
      "password": "saurabhp",
      "roles": [
         "ResellerAdmin",
         "heat_stack_owner",
         "Member"
      ]
   }
]

Я хочу отформатировать его следующим образом:

{
    "fool": {
        "admin": {
            "username": "admin",
            "password": "pa55word",
            "tenant_name": "demo"
        },
        "users": [
            {
                "username": "normal_user",
                "password": "password",
                "user_domain_name": "Default",
                "project_name": "normal_project",
                "project_domain_name": "Default"
            },
            {
                "username": "normal_user2",
                "password": "password",
                "user_domain_name": "Default",
                "project_name": "normal_project",
                "project_domain_name": "Default"
            }
        ]       
    }
}

Я могу разбить его на один объект на основе роль администратора с помощью этого:

.[] | if .roles[]=="admin" then {"username","password",project_name: .tenant_name} else {"username","password", "user_domain_name", project_name: .tenant_name, "project_domain_name" } end

но как я могу достичь желаемого результата?

1 Ответ

0 голосов
/ 06 мая 2020

С jq вы можете:

  • сохранить временное значение в переменной, используя . as $VARIABLENAME
  • итерацию по массиву с помощью map
  • перезаписать значение с помощью |=
  • применить условие к каждому значению массива и вернуть логическое значение или использовать any

A возможно Решение может быть:

jq ' . as $alluser | 
   { "admin" : 
       $alluser |map(if .roles| any( . == "admin") then .roles|= empty else empty end),
      "users"  : 
       $alluser |map(if .roles| any( . == "admin") then empty else .roles|= empty end) } ' \
  your_datas.json

PS: руководство JQ здесь https://stedolan.github.io/jq/manual/

...