Jayway JsonPath过滤器json以获取不同的值
您知道是否有一个过滤器函数可以从带有Jayway JsonPath的json文件中获取唯一(不同)的值吗 我有一个简单的jsonJayway JsonPath过滤器json以获取不同的值,json,jsonpath,Json,Jsonpath,您知道是否有一个过滤器函数可以从带有Jayway JsonPath的json文件中获取唯一(不同)的值吗 我有一个简单的json { "services": [ { "value": "ThingA", "functions": [ { "value": "1" }, { "value": "2" }, { "value": "3" } ] }, { "value": "ThingB", "
{ "services": [
{
"value": "ThingA",
"functions": [
{
"value": "1"
},
{
"value": "2"
},
{
"value": "3"
}
]
},
{
"value": "ThingB",
"functions": [
{
"value": "4"
},
{
"value": "1"
},
{
"value": "6"
}
]
}]}
我需要得到ThingA和ThingB的所有不同的函数值。
现在,我用过滤器过滤
$.services[?(@.value in ['thingA','thingB'])].functions[*][*]
但这给了我值1,2,3,4,1,6(所以1重复两次)
谢谢您也许可以使用
com.jayway.jsonpath.Predicate
来过滤不同的值,如下所示:
@Test
public void canExtractDistinctValues() {
List<String> read = JsonPath.parse(... your json ...).read("$.services[?(@.value in ['ThingA','ThingB'])].functions[?].value", List.class,
new DistinctPredicate("value"));
assertThat(read.size(), is(5));
assertThat(read, hasItem("1"));
assertThat(read, hasItem("2"));
assertThat(read, hasItem("3"));
assertThat(read, hasItem("4"));
assertThat(read, hasItem("6"));
}
private class DistinctPredicate implements Predicate {
private final String fieldName;
private final Set distinctValues;
public DistinctPredicate(String fieldName) {
this.fieldName = fieldName;
this.distinctValues = Sets.newHashSet();
}
@Override
public boolean apply(Predicate.PredicateContext context) {
String value = context.item(Map.class).get(fieldName).toString();
if (distinctValues.contains(value)) {
return false;
} else {
distinctValues.add(value);
return true;
}
}
}
@测试
public void可以提取distinctValues(){
List read=JsonPath.parse(…您的json…).read(“$.services[?(['ThingA','ThingB']中的@.value)]。函数[?].value”,List.class,
新的DistinctPredicate(“价值”);
断言(read.size(),为(5));
资产(读作“1”)项;
资产(读作“2”)项;
资产(已阅读,有第(3)项);
资产(已读,有第(4)项);
资产(读作“第6项”);
}
私有类DistinctPredicate实现谓词{
私有最终字符串字段名;
私有最终集的差异值;
public DistinctPredicate(字符串字段名){
this.fieldName=字段名;
this.distinctValues=Sets.newHashSet();
}
@凌驾
公共布尔应用(Predicate.PredicateContext上下文){
字符串值=context.item(Map.class).get(fieldName).toString();
if(distinctValues.contains(value)){
返回false;
}否则{
增加(价值);
返回true;
}
}
}
您可以使用.distinct()
如下:
Arrays.stream(JsonPath
.parse(jsonString)
.read(jsonPath, String[].class))
.distinct()
.collect(Collectors.toList())
;