From 9a145021ea91c41e7c01029508060257ec04dd13 Mon Sep 17 00:00:00 2001 From: sdww0 <1315953661@qq.com> Date: Sun, 24 Apr 2022 15:59:45 +0800 Subject: [PATCH] fix issue #819 and add test cases --- .../internal/function/text/Length.java | 3 ++ .../internal/function/LengthFunctionTest.java | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 json-path/src/test/java/com/jayway/jsonpath/internal/function/LengthFunctionTest.java diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/function/text/Length.java b/json-path/src/main/java/com/jayway/jsonpath/internal/function/text/Length.java index 785938c9..8d2cbac2 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/function/text/Length.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/function/text/Length.java @@ -49,6 +49,9 @@ public class Length implements PathFunction { // for length - to the wildcard such that we request all of its children so we can get back an array and // take its length. Parameter lengthOfParameter = parameters.get(0); + if(lengthOfParameter.getPath().isDefinite()){ + return ctx.configuration().jsonProvider().length(lengthOfParameter.getValue()); + } if (!lengthOfParameter.getPath().isFunctionPath()) { Path path = lengthOfParameter.getPath(); if (path instanceof CompiledPath) { diff --git a/json-path/src/test/java/com/jayway/jsonpath/internal/function/LengthFunctionTest.java b/json-path/src/test/java/com/jayway/jsonpath/internal/function/LengthFunctionTest.java new file mode 100644 index 00000000..2ef40171 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/function/LengthFunctionTest.java @@ -0,0 +1,42 @@ +package com.jayway.jsonpath.internal.function; + +import com.jayway.jsonpath.JsonPath; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for length function. Length class: {@link com.jayway.jsonpath.internal.function.text.Length} + */ +public class LengthFunctionTest { + + private static final String testString = "{\n" + + "\t\"store\": {\n" + + "\t\t\"book\": [[\"book0-1\",\"book0-2\"],\"book1\", \"book2\", [\"book3\"]]" + + "\t},\n" + + " \"store1\": {\n" + + "\t\t\"book\": [\"book4\", [\"book5-1\",\"book5-2\"], \"book6\",[\"book7\"]]\n" + + "\t}\n" + + "}"; + + /** + * Test case for definite path + */ + @Test + public void testDefinite(){ + assertThat((int)JsonPath.read(testString,"$.length($.store.book)")).isEqualTo(4); + assertThat((int)JsonPath.read(testString,"$.length($.store.book[0])")).isEqualTo(2); + assertThat((int)JsonPath.read(testString,"$.length($.store1.book)")).isEqualTo(4); + } + /** + * Test case for indefinite path + */ + @Test + public void testIndefinite(){ + assertThat((int)JsonPath.read(testString,"$.length($..book)")).isEqualTo(8); + assertThat((int)JsonPath.read(testString,"$.length($.store..book)")).isEqualTo(4); + assertThat((int)JsonPath.read(testString,"$.length($.store1..book)")).isEqualTo(4); + assertThat((int)JsonPath.read(testString,"$.length($.store1..book[1])")).isEqualTo(2); + } + +}