【问题标题】:how I can filter duplicate results from the jsonarray by java 8 Lambda我如何通过 java 8 Lambda 过滤来自 jsonarray 的重复结果
【发布时间】:2022-01-27 06:33:17
【问题描述】:

我有以下 jasonArry,我需要根据 identifier 值过滤唯一结果

下面是我从不同 API 得到的 JSONArray,我需要过滤这个 JSONArray

JSONArray 


{
    "data": [
        [{
                "datatype": "DeviceDataUse",
                "values": {

                    "ensembleid": "194252612743",
                    "averagerating": "4.5",
                    "identifier": "dvc13080026prd",
                    "reviewcount": "",
                    "commentcount": ""
                }
            }, {
                "datatype": "DeviceSkuDataUse",
                "values": {
                    "identifier": "146200104",
                    "imagecount": "4",
                    "hexcode": "#DDDFDE",
                    "ensembleid": "194252612743"
                },
                "pageUrl": ""
            }, {
                "datatype": "DeviceDataUse",
                "values": {
                    "ensembleid": "194252697634",
                    "averagerating": "4.5",
                    "identifier": "dvc13470044prd",
                    "reviewcount": "96",
                    "commentcount": "0"
                }
            }, {
                "datatype": "DeviceSkuDataUse",
                "values": {
                    "identifier": "146202344",
                    "imagecount": "4",
                    "hexcode": "#DDDFDE",
                    "ensembleid": "194654612743"
                },
                "pageUrl": ""
            }, {
                "datatype": "DeviceDataUse",
                "values": {
                    "ensembleid": "194200097634",
                    "averagerating": "4.5",
                    "identifier": "dvc13478844prd",
                    "reviewcount": "96",
                    "commentcount": "0"
                }
            }, {
                "datatype": "DeviceSkuDataUse",
                "values": {
                    "identifier": "100002344",
                    "imagecount": "4",
                    "hexcode": "#DDDFDE",
                    "ensembleid": "194654000043"
                },
                "pageUrl": ""
            },
            {
                "datatype": "DeviceDataUse",
                "values": {

                    "ensembleid": "194252612743",
                    "averagerating": "4.5",
                    "identifier": "dvc13080026prd",
                    "reviewcount": "",
                    "commentcount": ""
                }
            }, {
                "datatype": "DeviceSkuDataUse",
                "values": {
                    "identifier": "146200104",
                    "imagecount": "4",
                    "hexcode": "#DDDFDE",
                    "ensembleid": "194252612743"
                },
                "pageUrl": ""
            }

        ]
    ]
}

我们可以使用 java 8 Lambda,

` 尝试了几件事,但没有得到基于标识符的唯一结果

`

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 向我们展示您的尝试
  • 你的过滤标准是什么

标签: java filter lambda collectors distinct-values


【解决方案1】:

我建议为此使用 Gson。 Gson 是一个 Java Json 序列化库。

这是一个示例测试,它与您使用GsonLombokJUnit 实现的目标类似:

public class JsonArrayFilteringTest {

    @Data
    class JsonElement {
        private String datatype;
        private Map<String,String> values;
    }

    @Data
    class JsonData {
        private List<JsonElement> data;
    }

    @Test
    public void test() {
        final String jsonStr = "your json data...";


        final JsonData jsonData = new GsonBuilder().create().fromJson(jsonStr, JsonData.class);
        final long numberOfOccurrences = jsonData.getData().stream()
                .map(element -> element.values)
                .filter(value -> value.containsKey("identifier") && value.get("identifier").equals("dvc13080026prd"))
                .count();

        assertEquals(2, numberOfOccurrences);

    }
}

【讨论】:

    【解决方案2】:

    您可以使用 Collectors toMap 收集并检索值。使用 Jackson 并仅读取数组的示例

    ObjectMapper objectMapper = new ObjectMapper();
    
    ArrayNode arrayNode = (ArrayNode) objectMapper.readTree(jsonArray);
    
    StreamSupport.stream(Spliterators.spliteratorUnknownSize(arrayNode.elements(), 0), false)
            .collect(Collectors.toMap(
                    element -> element.get("values").get("identifier").asText(), // key
                    Function.identity(), // element
                    (first, second) -> first)) // function to handle duplicates
            .values()
            .forEach(System.out::println);
    

    【讨论】:

    • 嗨 Jeremy Dsilva,感谢您帮助我,我收到以下错误,当我尝试在 readTree 中传递 jsonArray 时,readTree 仅支持 JsonParser。 ArrayNode arrayNode = (ArrayNode) objectMapper.readTree(jsonArray);错误:ObjectMapper 类型中的方法 readTree(JsonParser) 不适用于参数 (JSONArray)
    • 你在用杰克逊吗? Jackson 的使用是为了演示一个使用 Streams 的工作示例。您需要根据您使用的 JSON 库修改代码。
    • 是的,我正在使用 Jackson
    • JSONArray的类型是什么?
    【解决方案3】:

    您可以使用以下方法-

    1) Iterate over the array using stream.
    
    2) Maintain a Set<String> ( say identifierSet) which stores the identifier value.
    
    3) In the filter method extract the identifier(you can use 
    jsonPath for this) and check if identifierSet contains the current 
    identifier.
    
    If contains, return false 
    
    Else add the identifier to the identifierSet and return true.
    
    4) use collect method to collect the distinct values.
    

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 2012-10-15
      • 2017-04-07
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多