6

次のようなjsonが与えられた場合

{"arr1" : [1,2,3], "arr2" : []}

arr1 と arr2 という名前の配列があることが知られている場合、空の配列と空でない配列の両方で機能する配列の長さのjsonpath 式はありますか?

Google コードの JsonPath ライブラリを使用していくつかの試みを行いました。

JsonPath.read(json, "arr1.length")

しかし、配列には属性がないというエラーが発生します。

中間への後続の呼び出しではなく、配列の長さに解決される単一の文字列パスを探しています。

JsonPath.read(json, "arr1").length // useless to me

表現の複雑さのレベルは問わない。

コンテキストとして、パスと値のペアを使用してテスト スーツをフィードしたいと考えています。これは値に対してはうまく機能しますが、このパターンでは配列サイズをアサートできません。

4

2 に答える 2

8

配列の長さがアサーションにのみ必要な場合は、json-path-assertartifact を と組み合わせて使用​​できますJsonPath。Groovy で記述されたサンプルを次に示します。

@Grab('com.jayway.jsonpath:json-path:0.9.1')
@Grab('com.jayway.jsonpath:json-path-assert:0.9.1')

import com.jayway.jsonpath.JsonPath
import static com.jayway.jsonassert.JsonAssert.*
import static org.hamcrest.MatcherAssert.assertThat
import static org.hamcrest.Matchers.*

def json = /{ "arr1": [1,2,3], "arr2": [] }/

with(json).assertThat( "arr1", hasSize(3) )
          .assertThat( "arr2", hasSize(0) )
          .assertThat( "arr2", emptyCollection() )

異なるサイズの配列でアサーションが失敗することを確認します。最良の部分は、柔軟で多種多様なアサーションへの扉を開くHamcrest の Matcher API の使用です。

パス式AFAIKから長さを取得することはできません。

于 2014-07-16T15:02:42.650 に答える
1

@dmahapatroは正しいと言っています

パス式から長さを取得できません

ただし、特定の要素 (配列の最後の要素としましょう) にアクセスするためだけに必要な場合は、次のように使用できます。

{"arr1": [1,2,3], "arr2": [{"name": "a"}, {"name": "b"}]}
arr1[(@.length-1)]       // returns "3"
arr2[(@.length-1)].name  // returns "b"

より高度なリクエストを行うこともできますが、そのためにはプラグインのドキュメントを参照することをお勧めします。

于 2015-09-18T15:08:56.370 に答える