Přetváření volně strukturované JSON (názvy polí uloženy v poli)

0

Otázka

Mám takový zvláštní problém jsem se snažil dostat hlavu omotal kolem. Mám trochu JSON z API. Názvy polí jsou ve skutečnosti uloženy v .headerData.methodNames a většina hodnot jsou uloženy v .lightValueObjects[].data.

{
  "headerData": {
    "objectTypeName": "device",
    "methodNames": [
      "name",
      "accessIp",
      "deviceType",
      "version",
      "discoverTime",
      "discoverMethod",
      "status",
      "department",
      "description",
      "perfMonStatus",
      "eventLogStatus",
      "maintenance",
      "location",
      "agentStatus",
      "policyName",
      "policyId",
      "agentType",
      "templateIds",
      "agentId",
      "decommission",
      "accountId",
      "instanceId",
      "agentVersion",
      "parserName"
    ]
  },
  "lightValueObjects": [
    {
      "objectId": 17657,
      "custId": 1,
      "parentId": null,
      "collectorId": null,
      "data": [
        "super",
        "192.168.128.222",
        "leader",
        null,
        1637092568000,
        "LOG",
        1,
        "Super",
        null,
        "",
        "Normal",
        "",
        null,
        "",
        "",
        "",
        null,
        "",
        null,
        false,
        "",
        "",
        null,
        ""
      ],
      "extData": null,
      "naturalId": "lead%2dsuper",
      "aoSys": false
    },
    {
      "objectId": 883252,
      "custId": 1,
      "parentId": null,
      "collectorId": null,
      "data": [
        "fw01",
        "192.168.128.1",
        "fw",
        "ANY",
        1637098725000,
        "LOG",
        1,
        "Super",
        null,
        "",
        "Normal",
        "",
        null,
        "",
        "",
        "",
        null,
        "",
        null,
        false,
        "",
        "",
        null,
        ""
      ],
      "extData": null,
      "naturalId": "fw01",
      "aoSys": false
    }
  ],
  "errCode": 0,
  "errObj": null,
  "dataType": "Device",
  "totalCount": 0
}

Následující kód vytváří lepší výstup, ale to není úplně ideální.

.headerData.methodNames as $header | [.lightValueObjects[].data] | map(
      . as $o |
      reduce .[] as $item({}; ($o | index($item)) as $index |
      .[$header[$index]] = (if $item == "" then null else $item end))
      )
[
  {
    "name": "super",
    "accessIp": "192.168.128.222",
    "deviceType": "leader",
    "version": null,
    "discoverTime": 1637092568000,
    "discoverMethod": "LOG",
    "status": 1,
    "department": "Super",
    "perfMonStatus": null,
    "eventLogStatus": "Normal",
    "decommission": false
  },
  {
    "name": "fw01",
    "accessIp": "192.168.128.1",
    "deviceType": "fw",
    "version": "ANY",
    "discoverTime": 1637098725000,
    "discoverMethod": "LOG",
    "status": 1,
    "department": "Super",
    "description": null,
    "perfMonStatus": null,
    "eventLogStatus": "Normal",
    "decommission": false
  }
]

Aktuální Problémy

  1. Tam by měla být 24 polí vrátil na zařízení, ale pouze 11 jsou zobrazeny.
  2. Nebyl jsem schopen přijít na to, jak sloučit pojmenované hodnoty .lightValueObjects na konečný výstup.

Zde je příklad toho, co jsem snaží, aby na výstupu ukázat, (udržet věci jednoduché, já jsem jen ukazuje 1 zařízení)

[
  {
    "name": "super",
    "accessIp": "192.168.128.222",
    "deviceType": "leader",
    "version": null,
    "discoverTime": 1637092568000,
    "discoverMethod": "LOG",
    "status": 1,
    "department": "Super",
    "description": null,
    "perfMonStatus": null,
    "eventLogStatus": "Normal",
    "maintenance": null,
    "location": null,
    "agentStatus": null,
    "policyName": null,
    "agentType": null,
    "templateIds": null,
    "agentId": null,
    "decommission": false,
    "accountId": null,
    "instanceId": null,
    "agentVersion": null,
    "parserName": null,
    "objectId": 17657,
    "custId": 1,
    "parentId": null,
    "collectorId": null,
    "extData": null,
    "naturalId": "lead%2dsuper",
    "aoSys": false
  }
]

Jakákoliv pomoc bude VELMI ocenil!!

jq
2021-11-23 17:56:07
1

Nejlepší odpověď

0

Nevím, jestli mám všechny své zarovnání vpravo, ale dát to zkusit:

.headerData.methodNames as $header
| .lightValueObjects | map(
  ( [$header, .data]
    | transpose
    | map({(first): last})
    | add
  ) + del(.data)
)
[
  {
    "name": "super",
    "accessIp": "192.168.128.222",
    "deviceType": "leader",
    "version": null,
    "discoverTime": 1637092568000,
    "discoverMethod": "LOG",
    "status": 1,
    "department": "Super",
    "description": null,
    "perfMonStatus": "",
    "eventLogStatus": "Normal",
    "maintenance": "",
    "location": null,
    "agentStatus": "",
    "policyName": "",
    "policyId": "",
    "agentType": null,
    "templateIds": "",
    "agentId": null,
    "decommission": false,
    "accountId": "",
    "instanceId": "",
    "agentVersion": null,
    "parserName": "",
    "objectId": 17657,
    "custId": 1,
    "parentId": null,
    "collectorId": null,
    "extData": null,
    "naturalId": "lead%2dsuper",
    "aoSys": false
  },
  {
    "name": "fw01",
    "accessIp": "192.168.128.1",
    "deviceType": "fw",
    "version": "ANY",
    "discoverTime": 1637098725000,
    "discoverMethod": "LOG",
    "status": 1,
    "department": "Super",
    "description": null,
    "perfMonStatus": "",
    "eventLogStatus": "Normal",
    "maintenance": "",
    "location": null,
    "agentStatus": "",
    "policyName": "",
    "policyId": "",
    "agentType": null,
    "templateIds": "",
    "agentId": null,
    "decommission": false,
    "accountId": "",
    "instanceId": "",
    "agentVersion": null,
    "parserName": "",
    "objectId": 883252,
    "custId": 1,
    "parentId": null,
    "collectorId": null,
    "extData": null,
    "naturalId": "fw01",
    "aoSys": false
  }
]

Demo

Edit: Pokud chcete nahradit prázdné řetězce "" s null,, jak jste ve vašem přístupu, nahradit last z mého řešení, buď s (last | select(. != "") // null) nebo více explicitně, s (last | if . == "" then null else . end).

2021-11-23 21:56:51

To funguje jako šampión! A je mnohem čistší, než ta moje! Jedna věc k poznámce, jsem se snažil (vyberte(poslední != "") // null), ale to nahrazuje "" s pole. Skončil jsem s použitím (pokud se v loňském == "" then null else poslední end) Děkuji moc!
Ken

Moje chyba, měl (last | select(. != "") // null). Ale jít s if-then-else-end je v pořádku, taky.
pmf

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................