【问题标题】:Remove duplicates from JSONArray java [closed]从 JSONArray java 中删除重复项 [关闭]
【发布时间】:2020-02-21 07:25:36
【问题描述】:

我有一个带有 json 对象集合的 JSONArray。我想从列表中删除重复项。问题似乎很简单。但是其他堆栈溢出答案中的代码似乎很大。

有人为我提供任何解决方案来处理这个问题并让代码更精简。

JSONArray jsonElement1 = new JSONArray("[{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-28T18:37:00.000Z\"},\"sort\":[1576653361740],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-29T18:35:00.000Z\"},\"sort\":[1576653361740],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-30T18:41:00.000Z\"},\"sort\":[1576653361739],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-30T18:41:00.000Z\"},\"sort\":[1576653361739],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-28T18:37:00.000Z\"},\"sort\":[1576653361740],\"_score\":null}]");

转换后:

[
{"_index":"sales_csv","_source":{"Order Date":"2016-01-28T18:37:00.000Z"},"sort":[1576653361740],"_score":null},
{"_index":"sales_csv","_source":{"Order Date":"2016-01-29T18:35:00.000Z"},"sort":[1576653361740],"_score":null},
{"_index":"sales_csv","_source":{"Order Date":"2016-01-30T18:41:00.000Z"},"sort":[1576653361739],"_score":null},
{"_index":"sales_csv","_source":{"Order Date":"2016-01-30T18:41:00.000Z"},"sort":[1576653361739],"_score":null},
{"_index":"sales_csv","_source":{"Order Date":"2016-01-28T18:37:00.000Z"},"sort":[1576653361740],"_score":null}
]

我想从 JSONArray 中删除重复项。

需要的输出:

[
{"_index":"sales_csv","_source":{"Order Date":"2016-01-28T18:37:00.000Z"},"sort":[1576653361740],"_score":null},
{"_index":"sales_csv","_source":{"Order Date":"2016-01-29T18:35:00.000Z"},"sort":[1576653361740],"_score":null},
{"_index":"sales_csv","_source":{"Order Date":"2016-01-30T18:41:00.000Z"},"sort":[1576653361739],"_score":null}
]

【问题讨论】:

  • 你用什么库来解析json? JSONArray的全类名是什么?

标签: java arrays json


【解决方案1】:

使用集合框架的Set怎么样? Set 可以检查重复数据。

对不起,我的代码看起来很糟糕,但我相信你能理解我的代码。

package stackoverflow.test;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import java.util.HashSet;
import java.util.Set;

public class Test1 {

    public static JSONArray sampleJSONArrayData;

    public static void main(String[] args) {
        JSONParser parser = new JSONParser();
        try {
            sampleJSONArrayData = (JSONArray)parser.parse("[\n" +
                    "{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-28T18:37:00.000Z\"}," +
                    "\"sort\":[1576653361740],\"_score\":null},\n" +
                    "{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-29T18:35:00.000Z\"}," +
                    "\"sort\":[1576653361740],\"_score\":null},\n" +
                    "{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-30T18:41:00.000Z\"}," +
                    "\"sort\":[1576653361739],\"_score\":null},\n" +
                    "{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-30T18:41:00.000Z\"}," +
                    "\"sort\":[1576653361739],\"_score\":null},\n" +
                    "{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-28T18:37:00.000Z\"}," +
                    "\"sort\":[1576653361740],\"_score\":null}\n" +
                    "]");
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.print("Print original data : ");
        System.out.println(sampleJSONArrayData);

        Set<JSONObject> filterSetData = new HashSet();
        filterSetData.addAll(sampleJSONArrayData);

        System.out.print("Print filtered data : ");
        System.out.println(filteredJSONArray);
    }
}

这是输出

Print original data : [{"_index":"sales_csv","_source":{"Order Date":"2016-01-28T18:37:00.000Z"},"sort":[1576653361740],"_score":null},{"_index":"sales_csv","_source":{"Order Date":"2016-01-29T18:35:00.000Z"},"sort":[1576653361740],"_score":null},{"_index":"sales_csv","_source":{"Order Date":"2016-01-30T18:41:00.000Z"},"sort":[1576653361739],"_score":null},{"_index":"sales_csv","_source":{"Order Date":"2016-01-30T18:41:00.000Z"},"sort":[1576653361739],"_score":null},{"_index":"sales_csv","_source":{"Order Date":"2016-01-28T18:37:00.000Z"},"sort":[1576653361740],"_score":null}]
Print filtered data : [[{"_index":"sales_csv","_source":{"Order Date":"2016-01-28T18:37:00.000Z"},"sort":[1576653361740],"_score":null}, {"_index":"sales_csv","_source":{"Order Date":"2016-01-29T18:35:00.000Z"},"sort":[1576653361740],"_score":null}, {"_index":"sales_csv","_source":{"Order Date":"2016-01-30T18:41:00.000Z"},"sort":[1576653361739],"_score":null}]]

【讨论】:

  • 即使键的顺序不同,这种方法是否有效?
  • 是的。因为解析器(JSONParser)重新排列了 JSONObject 数据。所以如果键的顺序不同,它会起作用。
  • 您可能想要处理filteredJSONArray.add(filterSetData);,因为它正在创建一个数组数组,如Print filtered data : [[{"_index":"... 所示。用filteredJSONArray.addAll(filterSetData); 替换它应该可以工作。
  • 谢谢!我没有检查它。所以我更改了我的代码System.out.println(filterSetData);,所以它就像那样打印。 Print filtered data : [{"_index":"sales_csv ...
  • 您也可以使用addAll 方法如filteredJSONArray.addAll(filterSetData); 将集合的所有元素添加到JSONArray
【解决方案2】:

我不确定您正在使用 JSONArray 的 lib,但从中收集唯一值应该相对简单。

此示例显示使用 Jackson 将 JSON 读入 JsonNode,如果您只是想根据每行的 toString 检查是否相等,您可以创建一个值的 HashSet 以过滤掉重复项。

final String json
        = "[{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-28T18:37:00.000Z\"},\"sort\":[1576653361740],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-29T18:35:00.000Z\"},\"sort\":[1576653361740],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-30T18:41:00.000Z\"},\"sort\":[1576653361739],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-30T18:41:00.000Z\"},\"sort\":[1576653361739],\"_score\":null},{\"_index\":\"sales_csv\",\"_source\":{\"Order Date\":\"2016-01-28T18:37:00.000Z\"},\"sort\":[1576653361740],\"_score\":null}]";

final Set<String> result = new HashSet<>();
final com.fasterxml.jackson.databind.JsonNode jsonNode
        = new com.fasterxml.jackson.databind.ObjectMapper()
            .readValue(json, com.fasterxml.jackson.databind.JsonNode.class);
jsonNode.forEach(t -> {
        result.add(t.toString());
    });
result.forEach(System.out::println);

【讨论】:

    【解决方案3】:

    使用Set with String key,把所有东西都放进去,然后get。

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2023-02-08
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多