2
votes

Comment vérifier qu'un tableau dans les données JSON est vide en utilisant jmespath?

J'ai des données json comme ci-dessous:

[
  {
    "id": "i_1",
    "name": "abc",
    "address": [
      {
        "city": [
          "city1",
          "city2"
        ]
      },
      {
        "city": [
          "city1",
          "city2"
        ]
      }
    ]
  },
  {
    "id": "i_2",
    "name": "def",
    "address": [
      {
        "city": []
      },
      {
        "city": []
      }
    ]
  }
]

Maintenant, je ne veux que les données où le tableau city n'est pas null . Ainsi, dans l'exemple ci-dessus, la sortie doit être le 1er élément, c'est-à-dire avec l'id i_1.

Comment filtrer ce json en utilisant bibliothèque jmespath ?


0 commentaires

4 Réponses :


0
votes

Vous pouvez le faire en javascript pur en utilisant filter et tous les

const items=[{"id":"i_1","name":"abc","address":[{"city":["city1","city2"]},{"city":["city1","city2"]}]},{"id":"i_2","name":"def","address":[{"city":[]},{"city":[]}]}]

const filtered = items.filter(i => i.address.every(a => a.city && a.city.length > 0))

console.log(filtered)

Ceci n'est renvoyé que si chaque objet à l'intérieur de adresse a un tableau de villes non vide.


3 commentaires

Je veux faire cela en utilisant jmespath, y a-t-il un moyen de le faire en utilisant jmespath?


vous pouvez simplifier un peu cela en changeant a.city.length> 0 en simplement a.city.length


@MonarthSarvaiya Je ne sais pas, désolé. Fournir simplement une solution javascript alternative.



0
votes

Vous n'avez pas besoin d'utiliser la bibliothèque jmespath , utilisez filter et `every from the vanilla JS. C'est plus efficace.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.js"></script>
let jsonTxt = '{"data":[{"id":"i_1","name":"abc","address":[{"city":["city1","city2"]},{"city":["city1","city2"]}]},{"id":"i_2","name":"def","address":[{"city":[]},{"city":[]}]}]}'

let jsonData = JSON.parse(jsonTxt);
let items = jsonData.data;
const result = items.filter(i => i.address.every(a => a.city && a.city.length))
console.log('id: ', result[0].id);
//using jmespath
console.log(jmespath.search({data: items}, "data[*].address[*].city"));


1 commentaires

J'utilise d'autres filtres de jmespath, à ce stade, je suis bloqué, donc je veux une solution uniquement en utilisant jmespath. Voici seulement une partie de mon code.



0
votes

<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.js"></script>
var arr = [
  {
    "id": "i_1",
    "name": "abc",
    "address": [
      {
        "city": [
          "city1",
          "city2"
        ]
      },
      {
        "city": [
          "city1",
          "city2"
        ]
      }
    ]
  },
  {
    "id": "i_2",
    "name": "def",
    "address": [
      {
        "city": []
      },
      {
        "city": []
      }
    ]
  }
];
console.log(jmespath.search({ c: arr}, "not_null(c[].address[].city[])"));

Je ne sais pas quel est votre résultat. pouvez-vous mieux expliquer?


0 commentaires

3
votes

Vous pouvez faire ceci:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.js"></script>
var arr = [
  {
    "id": "i_1",
    "name": "abc",
    "address": [
      {
        "city": [
          "city1",
          "city2"
        ]
      },
      {
        "city": [
          "city1",
          "city2"
        ]
      }
    ]
  },
  {
    "id": "i_2",
    "name": "def",
    "address": [
      {
        "city": []
      },
      {
        "city": []
      }
    ]
  }
];

console.log(jmespath.search(arr,"[?not_null(address[].city[])]"));


0 commentaires