Jayway JsonPath过滤器json以获取不同的值

Jayway JsonPath过滤器json以获取不同的值,json,jsonpath,Json,Jsonpath,您知道是否有一个过滤器函数可以从带有Jayway JsonPath的json文件中获取唯一(不同)的值吗 我有一个简单的json { "services": [ { "value": "ThingA", "functions": [ { "value": "1" }, { "value": "2" }, { "value": "3" } ] }, { "value": "ThingB", "

您知道是否有一个过滤器函数可以从带有Jayway JsonPath的json文件中获取唯一(不同)的值吗

我有一个简单的json

{  "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())
   ;