Reputation: 103
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
}
]
Upvotes: 0
Views: 75
Reputation: 130937
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"
} ]
Upvotes: 1