Получить данные из вложенного массива объектов - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь найти файл JSON для получения указанных значений c и имени .items [] из словаря в том же файле.

Источник. json Файл: https://jqplay.org/s/0-o4HOox-K

{
  "name": "ABC Company",
  "assetbase": [{
    "name": "Added assets from API",
    "type": "access-section",
    "assetbase": [{
      "name": "Database A",
      "asset-number": 1,
      "items": ["0ABC-001", "0ABC-003", "0ABC-004"]
    }, {
      "name": "Database B",
      "asset-number": 2,
      "items": ["0ABC-001"]
    }, {
      "name": "Database C",
      "asset-number": 3,
      "items": ["0ABC-002", "0ABC-003"]
    }]
  }],
  "objects-dictionary": [{
    "uid": "0ABC-001",
    "name": "Cluster A"
  }, {
    "uid": "0ABC-002",
    "name": "Cluster B"

  }, {
    "uid": "0ABC-003",
    "name": "Unit-001"
  }, {
    "uid": "0ABC-004",
    "name": "Unit-002"
  }]
}

Ожидаемый результат:

"Database A","Cluster A";"Unit-001";"Unit-002"
"Database B","Cluster A"
"Database C","Cluster B";"Unit-001"

Я смотрю вокруг похожих тем и случайно протестирован на jqplay, но просто не может получить вывод.

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Pure jq решение:

jq -r '([(."objects-dictionary"[] | {key:.uid, value:.name})] | from_entries
       ) as $obj
       | .assetbase[] | .assetbase[]
       | [.name, (.items[] as $i | $obj[$i])]
       | @csv' < file.json

Используются только запятые, без точек с запятой, но, боюсь, jq не сможет этого сделать.

0 голосов
/ 26 февраля 2020

Это не решение bash, а решение JS.

Фрагмент ниже создает объект с именами баз данных в качестве ключей (смотрите в консоли):

const data = {
  "name": "ABC Company",
  "assetbase": [{
    "name": "Added assets from API",
    "type": "access-section",
    "assetbase": [{
      "name": "Database A",
      "asset-number": 1,
      "items": ["0ABC-001", "0ABC-003", "0ABC-004"]
    }, {
      "name": "Database B",
      "asset-number": 2,
      "items": ["0ABC-001"]
    }, {
      "name": "Database C",
      "asset-number": 3,
      "items": ["0ABC-002", "0ABC-003"]
    }]
  }],
  "objects-dictionary": [{
    "uid": "0ABC-001",
    "name": "Cluster A"
  }, {
    "uid": "0ABC-002",
    "name": "Cluster B"

  }, {
    "uid": "0ABC-003",
    "name": "Unit-001"
  }, {
    "uid": "0ABC-004",
    "name": "Unit-002"
  }]
}

const mapAssets = (assetbase, dictionary) => {
  const ret = assetbase.reduce((a, c) => {
    if (typeof a[c.name] === "undefined") a[c.name] = []
    a[c.name].push(c.name)
    c.items.forEach(e => {
      const {
        name
      } = dictionary.find(el => {
        return el.uid === e
      })
      a[c.name].push(name)
    })
    return a
  }, {})
  return ret
}

const mapped = mapAssets(data.assetbase[0].assetbase, data["objects-dictionary"])

console.log('mapped:', mapped)
0 голосов
/ 26 февраля 2020

Используя jq ( ссылка ), вы можете легко анализировать. json файлы.

Вот довольно близкое решение для вас:

$ jq -r '.assetbase[].assetbase[] | .name' test.json |
    while read name; do echo -ne "\"$name\"," ;
      jq -r --arg name "$name" '.assetbase[].assetbase[] |
      select (.name | contains($name)) | .items[]' test.json |
      while read uid; do
        jq -r --arg uid $uid '."objects-dictionary"[] |
        select (.uid | contains($uid)) | .name' test.json |
        while read oname; do echo -ne "\"$oname\";" ; done;
      done; echo -ne "\n" ;
    done

"Database A","Cluster A";"Unit-001";"Unit-002";
"Database B","Cluster A";
"Database C","Cluster B";"Unit-001";

Вы можете легко установить его с помощью стандартного менеджера пакетов: sudo yum install -y jq для дистрибутивов на основе RPM (например, RedHat) или sudo apt-get install -y jq для дистрибутивов на основе Debian (Ubuntu, et c.);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...