web-dev-qa-db-fra.com

Obtention d'une valeur unique à partir d'un objet JSON à l'aide de JSONPath

J'ai le JSON suivant et j'ai besoin d'obtenir la valeur simple name en utilisant JSONPath :

{
  "single" : {
    "id" : 1, 
    "name" : "Item name"
  }
}

L'expression que j'ai utilisée est $.single.name mais j'obtiens toujours un tableau:

[ "Item name" ]

au lieu d'une valeur de chaîne ("Item name").

18
Ilija

mais j'obtiens toujours un tableau:

Cela doit arriver. Comme vous pouvez le lire dans cette documentation , sous 'Résultat' (presque en bas):

Veuillez noter que la valeur de retour de jsonPath est un tableau, qui est également une structure JSON valide. Vous pouvez donc appliquer à nouveau jsonPath à la structure résultante ou utiliser l'une de vos méthodes de tableau préférées comme tri avec.

Donc, fondamentalement, il retournera toujours un tableau. Si vous avez besoin des données comme un autre type, par exemple une chaîne dans ce cas, vous devrez faire la conversion vous-même, je le crains.

14
Tim Castelijns

J'utilisais le implémentation Java de JSONPath et suis arrivé au même problème. Ce qui a fonctionné pour moi, c'était d'ajouter "[0]" à la chaîne de chemin json. Donc dans votre cas:

$.single.name[0]

7
pepan

Je pense que cela dépend de l'implémentation du langage.

Par exemple, dans nodejs, il existe un module npm: https://www.npmjs.com/package/jsonpath

Qui ont une méthode appelée value , qui fait exactement ce dont nous avons besoin

jp.value (obj, pathExpression [ newValue])

Renvoie la valeur du premier élément correspondant à pathExpression. Si newValue est fourni, définit la valeur du premier élément correspondant et renvoie la nouvelle valeur.

Je l'ai essayé et travaillé!

0
JRichardsz

Je sais que c'est une vieille question, mais ce qui suit a fonctionné pour moi lors de l'écriture d'un test unitaire pour une application Spring Boot. J'espère que cela aide quelqu'un dans une situation similaire.

Comme l'a mentionné Tim Castelijns, le résultat est toujours un tableau.

Échantillon Json

{
  "validationErrors": [
    {
      "field": "location",
      "message": "must not be null"
    },
    {
      "field": "address",
      "message": "must not be blank"
    },
    {
      "field": "id",
      "message": "must be null"
    },
    {
      "field": "name",
      "message": "must not be blank"
    }
  ]
}

et la partie test unitaire

//verify if the id is validated for null
andExpect((ResultMatcher) jsonPath("$.validationErrors[?(@.field=='id')].message").isArray()).
andExpect((ResultMatcher) jsonPath("$.validationErrors[?(@.field=='id')].message",hasItem("must be null"))).
0
Ranjit Gopinathan