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 2fcd3a33..069c0d4b 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 @@ -3,6 +3,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.json.Unique; import com.jayway.jsonpath.internal.function.numeric.Average; import com.jayway.jsonpath.internal.function.numeric.Max; import com.jayway.jsonpath.internal.function.numeric.Min; @@ -46,6 +47,7 @@ public class PathFunctionFactory { map.put("size", Length.class); map.put("append", Append.class); map.put("keys", KeySetFunction.class); + map.put("unique", Unique.class); FUNCTIONS = Collections.unmodifiableMap(map); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/function/json/Unique.java b/json-path/src/main/java/com/jayway/jsonpath/internal/function/json/Unique.java new file mode 100644 index 00000000..504b8fb4 --- /dev/null +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/function/json/Unique.java @@ -0,0 +1,55 @@ +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 net.minidev.json.JSONArray; + +import java.util.List; +import java.util.Iterator; +import java.util.HashMap; + +public class Unique implements PathFunction { + @Override + public Object invoke(String currentPath, PathRef parent, Object model, EvaluationContext ctx, List parameters) { + if (null != parameters && parameters.size() > 0) { + Object value = parameters.get(0).getValue(); + // the value should be list + if (!(value instanceof List)){ + return value; + } + return unique(((List) value).iterator()); + } + if (ctx.configuration().jsonProvider().isArray(model)) { + return unique(ctx.configuration().jsonProvider().toIterable(model).iterator()); + } else if(ctx.configuration().jsonProvider().isMap(model)){ + return model; + }else{ + return model; + } + } + + /** + * Do unique operation using HashMap. + * @param iterator iterator + * @return JSONArray + */ + private JSONArray unique(Iterator iterator){ + HashMap objectHashMap = new HashMap<>(); + int answerPosition = 0; + // make sure it is in order by using index as key, object as value. + while(iterator.hasNext()){ + Object obj = iterator.next(); + if(!objectHashMap.containsValue(obj)){ + objectHashMap.put(answerPosition++,obj); + } + } + JSONArray result = new JSONArray(); + for(int n = 0;n