-1
votes

Obtenir des données d'une matrice imbriquée d'objets

J'essaie de Parson le fichier JSON pour obtenir des valeurs spécifiques et .Items [] nom du dictionnaire dans le même fichier.

fichier source.json: https://jqplay.org/s/0-o4hoox- K xxx

Sortie attendue: xxx

J'ai regardé autour des threads similaires et testé au hasard sur jqplay mais ne peut tout simplement pas obtenir la sortie.


1 commentaires

Premièrement, veuillez ajouter le code que vous avez écrit pour résoudre ceci à la question afin que nous puissions vous aider à le déboguer. Deuxièmement, la sortie attendue n'est pas une structure de données valide.


3 Réponses :


0
votes

Utilisation JQ ( lien ), vous pouvez facilement analyser. Fichiers JSON.

Voici une solution assez étroite pour vous: xxx

Vous pouvez facilement l'installer via votre gestionnaire de packages commun: sudo yum install -y jq pour des distributions basées sur RPM (comme redhat) ou sudo apt-get install -y jq pour Debian (Ubuntu, etc.);


0 commentaires

0
votes

Ce n'est pas une solution Bash, mais un JS One.

Le snippet ci-dessous crée un objet qui a les noms de base de données sous forme de touches (regardez dans la console): p>

p>

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 commentaires

2
votes

Pure JQ code> solution:

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


1 commentaires

Solution concise et belle, merci monsieur de partager.