Jq - преобразование JSON в другой формат JSON с использованием jq - PullRequest
0 голосов
/ 09 октября 2019

Я использовал jqplay для воспроизведения формата. как-то из какого-то другого формата я смог добраться до формата ниже. Но теперь я хочу изменить этот формат, как показано ниже. Это в основном я хочу объединить объект, где оба идентификатора одинаковы.

'Input'

[
  {
    "id": "7972",
    "secondaryAddresses": {
      "1-2G8AXE": {
        "isDefaultBillingAddress": "true",
        "isDefaultShippingAddress": "true",
      }
    }
  }
]
[
  {
    "id": "7972",
    "secondaryAddresses": {
      "1-4BR2P6B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]
[
  {
    "id": "6980",
    "secondaryAddresses": {
      "1-9BR289B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]
[
  {
    "id": "6980",
    "secondaryAddresses": {
      "1-8B0989B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]

Output

[
  {
    "id": "7972",
    "secondaryAddresses": {
      "1-2G8AXE": {
        "isDefaultBillingAddress": "true",
        "isDefaultShippingAddress": "true",
      },
       "1-4BR2P6B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  },
  {
    "id": "6980",
    "secondaryAddresses": {
      "1-9BR289B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      },
       "1-8B0989B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]

пожалуйста, помогите мне с этим. Я хочу преобразовать один JSON в другой формат JSON, используя какой-то шаблон.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вот эффективное решение, которое оказывается довольно простым, хотя и за счет вспомогательной функции. Поскольку эта функция является общей, возможно, стоит добавить в вашу библиотеку такие функции.

def aggregate_by(s; f; g):
  reduce s as $x  (null; .[$x|f] += [$x|g]);

В следующих случаях используется inputs, и, соответственно, их следует использовать вместе с параметром командной строки jq's -n. :

aggregate_by( inputs[]; .id; .secondaryAddresses)
| map_values( add )
| to_entries
| map( {id: .key, secondaryAddresses: .value } )
0 голосов
/ 09 октября 2019

После исправления ввода образца следующий вызов

< sample.json jq -n '
  [inputs[]]
  | group_by(.id)
  | map( reduce .[] as $x
           (.[0]|{id}; 
           .secondaryAddresses += ($x | .secondaryAddresses)))'

производит:

[
  {
    "id": "6980",
    "secondaryAddresses": {
      "1-9BR289B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false"
      },
      "1-8B0989B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false"
      }
    }
  },
  {
    "id": "7972",
    "secondaryAddresses": {
      "1-2G8AXE": {
        "isDefaultBillingAddress": "true",
        "isDefaultShippingAddress": "true"
      },
      "1-4BR2P6B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false"
      }
    }
  }
]
...