简体   繁体   中英

Remove repeatable value from JSONArray (Java)

I have a JSON array as you can see below with multiple JSON objects having two keys:

1) submitted_datetime

2) value

I need to remove those JSON objects whose value is repeated and keep only the most recent value.

I want to keep duplicated values, but not repeat the same value in a row.

I have to do this with Java language!!!

Any ideas ? Thanks in advance

Sample JSON

[{
        "submitted_datetime": "2018-06-29 11:14:30",
        "value": 6
    }, {
        "submitted_datetime": "2018-06-29 11:16:20",
        "value": 6
    }, {
        "submitted_datetime": "2018-06-29 11:41:59",
        "value": 6
    }, {
        "submitted_datetime": "2018-06-29 11:43:49",
        "value": 2
    }, {
        "submitted_datetime": "2018-06-29 11:46:13",
        "value": 10
    }, {
        "submitted_datetime": "2018-06-29 11:46:42",
        "value": 10
    }, {
        "submitted_datetime": "2018-06-29 12:01:33",
        "value": 8
    }, {
        "submitted_datetime": "2018-06-29 12:02:28",
        "value": 8
    }, {
        "submitted_datetime": "2018-06-29 12:35:52",
        "value": 6
    }, {
        "submitted_datetime": "2018-06-29 12:35:53",
        "value": 8
    }
]

Expected Result

[   {
        "submitted_datetime": "2018-06-29 11:41:59",
        "value": 6
    }, {
        "submitted_datetime": "2018-06-29 11:43:49",
        "value": 2
    }, {
        "submitted_datetime": "2018-06-29 11:46:42",
        "value": 10
    }, {
        "submitted_datetime": "2018-06-29 12:01:33",
        "value": 8
    }, {
        "submitted_datetime": "2018-06-29 12:35:52",
        "value": 6
    }, {
        "submitted_datetime": "2018-06-29 12:35:53",
        "value": 8
    }
]

If you are willing to use Jackson , a popular JSON parser for Java, you could create a class to map the items to:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {

    @JsonProperty("submitted_datetime")
    private String submittedDateTime;

    private Integer value;

    // Getters and setters
}

Then read the JSON array as a list:

ObjectMapper mapper = new ObjectMapper();
List<Foo> list = mapper.readValue(json, new TypeReference<List<Foo>>() {});

Then build a new list with the items you need (I'm assuming the list is ordered):

Foo previousItem = null;
List<Foo> filteredList = new ArrayList<>();

for (Iterator<Foo> iterator = list.iterator(); iterator.hasNext();) {

    Foo item = iterator.next();

    if (previousItem != null && !item.getValue().equals(previousItem.getValue())) {
        filteredList.add(previousItem);
    }

    if (!iterator.hasNext() && !item.getValue().equals(previousItem.getValue())) {
        filteredList.add(item);
    }

    previousItem = item;            
}

And finally create a new JSON:

String newJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(filteredList);

The output will be:

[ {
  "value" : 6,
  "submitted_datetime" : "2018-06-29 11:41:59"
}, {
  "value" : 2,
  "submitted_datetime" : "2018-06-29 11:43:49"
}, {
  "value" : 10,
  "submitted_datetime" : "2018-06-29 11:46:42"
}, {
  "value" : 8,
  "submitted_datetime" : "2018-06-29 12:02:28"
}, {
  "value" : 6,
  "submitted_datetime" : "2018-06-29 12:35:52"
}, {
  "value" : 8,
  "submitted_datetime" : "2018-06-29 12:35:53"
} ]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM