diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/function/PathFunctionFactory.java b/json-path/src/main/java/com/jayway/jsonpath/internal/function/PathFunctionFactory.java index 6beda0e2..d809628a 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/function/PathFunctionFactory.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/function/PathFunctionFactory.java @@ -2,6 +2,7 @@ package com.jayway.jsonpath.internal.function; import com.jayway.jsonpath.InvalidPathException; import com.jayway.jsonpath.internal.function.json.Append; +import com.jayway.jsonpath.internal.function.json.KeySetFunction; import com.jayway.jsonpath.internal.function.numeric.Average; import com.jayway.jsonpath.internal.function.numeric.Max; import com.jayway.jsonpath.internal.function.numeric.Min; @@ -44,6 +45,7 @@ public class PathFunctionFactory { map.put("length", Length.class); map.put("size", Length.class); map.put("append", Append.class); + map.put("keys", KeySetFunction.class); FUNCTIONS = Collections.unmodifiableMap(map); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/function/json/KeySetFunction.java b/json-path/src/main/java/com/jayway/jsonpath/internal/function/json/KeySetFunction.java new file mode 100644 index 00000000..049d6de0 --- /dev/null +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/function/json/KeySetFunction.java @@ -0,0 +1,23 @@ +package com.jayway.jsonpath.internal.function.json; + +import com.jayway.jsonpath.internal.EvaluationContext; +import com.jayway.jsonpath.internal.PathRef; +import com.jayway.jsonpath.internal.function.Parameter; +import com.jayway.jsonpath.internal.function.PathFunction; + +import java.util.List; + +/** + * Author: Sergey Saiyan sergey.sova42@gmail.com + * Created at 21/02/2018. + */ +public class KeySetFunction implements PathFunction { + + @Override + public Object invoke(String currentPath, PathRef parent, Object model, EvaluationContext ctx, List parameters) { + if (ctx.configuration().jsonProvider().isMap(model)) { + return ctx.configuration().jsonProvider().getPropertyKeys(model); + } + return null; + } +} diff --git a/json-path/src/test/java/com/jayway/jsonpath/internal/function/KeySetFunctionTest.java b/json-path/src/test/java/com/jayway/jsonpath/internal/function/KeySetFunctionTest.java new file mode 100644 index 00000000..a39b4e33 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/function/KeySetFunctionTest.java @@ -0,0 +1,24 @@ +package com.jayway.jsonpath.internal.function; + +import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.Configurations; +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashSet; + +/** + * Author: Sergey Saiyan sergey.sova42@gmail.com + * Created at 21/02/2018. + */ +public class KeySetFunctionTest extends BaseFunctionTest { + + private Configuration conf = Configurations.JACKSON_CONFIGURATION; + + @Test + public void testKeySet() throws Exception { + String json = IOUtils.toString(getClass().getResourceAsStream("/keyset.json")); + verifyFunction(conf, "$.data.keys()", json, new HashSet(Arrays.asList("a", "b"))); + } +} diff --git a/json-path/src/test/resources/keyset.json b/json-path/src/test/resources/keyset.json new file mode 100644 index 00000000..3524aff8 --- /dev/null +++ b/json-path/src/test/resources/keyset.json @@ -0,0 +1,6 @@ +{ + "data" : { + "a" : "a", + "b" : "b" + } +} \ No newline at end of file