web-dev-qa-db-ja.com

JSONPathを使用してJSONオブジェクトから単一の値を取得する

次のJSONがあり、 JSONPath を使用してプレーンname値を取得する必要があります。

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

使用した式は$.single.nameしかし、私は常に配列を取得します:

[ "Item name" ]

文字列値("Item name")。

18
Ilija

しかし、私は常に配列を取得します:

それは起こることを意図しています。 このドキュメント で読むことができるように、「結果」の下(ほぼ下部)で:

JsonPathの戻り値は配列であり、これも有効なJSON構造であることに注意してください。したがって、結果の構造にjsonPathを再度適用するか、お気に入りの配列メソッドのいずれかを並べ替えて使用することができます。

したがって、基本的には常に配列を返します。他のタイプとしてデータが必要な場合、例えばこの場合、文字列、あなたは私が恐れている変換を自分で行う必要があります。

14
Tim Castelijns

JSONPathの Java実装 を使用していましたが、まったく同じ問題に遭遇しました。私のために働いたのは、jsonパス文字列に「[0]」を追加することでした。あなたの場合:

$.single.name[0]

7
pepan

言語の実装に依存すると思います。

たとえば、nodejsにはnpmモジュールがあります: https://www.npmjs.com/package/jsonpath

valueと呼ばれるメソッドがあり、まさに必要なことを行います

jp.value(obj、pathExpression [、newValue])

PathExpressionに一致する最初の要素の値を返します。 newValueが指定されている場合、最初に一致した要素の値を設定し、新しい値を返します。

私はそれを試して働いた!

0
JRichardsz

私はこれが古い質問であることを知っていますが、スプリングブートアプリケーションの単体テストを作成するときに次のように働きました。これが同様の状況で誰かを助けることを願っています。

Tim Castelijnsが述べたように、結果は常に配列です。

サンプル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"
    }
  ]
}

ユニットテストパート

//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