Get Count of JSON Key Using Java Stream

Question

Source: https://stackoverflow.com/questions/67016736/get-count-of-json-key-using-java-stream

I have a JSON object that looks like this:

[{

"startAt": 1617605301292,

"endAt": 1617605317095,

"duration": 15803,

"selection": {

"selected.Speed": "0",

"selected.Low": "65535",

"selected.Fast": "7173",

"selected.medium": "5"

},

"details": {

"phase": [{

"value": "2",

"timestamp": 1617605301316

}]

}

},

{

"startAt": 1617603849697,

"endAt": 1617603966378,

"duration": 116681,

"selection": {

"selected.Speed": "0",

"selected.Low": "65535",

"selected.Fast": "123",

"selected.medium": "5"

},

"details": {

"phase": [{

"value": "2",

"timestamp": 1617603849749

}]

}

}

]

I need to count how many times selected.Fast has occurred. I am trying with stream and this is what I have written so far:

List<Map<String, Object>> jsonObj = mapper.readValue(jArr, new TypeReference<List<Map<String, Object>>>(){});

Map<String, Long> counted = jsonObj.stream()

.map(x -> x.get("selection").toString() )

.collect(Collectors.toList())

.stream()

.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

System.out.println(counted.toString());

But I am getting count of all the key inside selection object, and I want count for specific JSON key which is selected.Fast. For example, selected.Fast:"7173" -> occurred - 5times selected.Fast:"123" -> occurred - 2times.

Any help would be appreciated.

Answer

To output information about a field of the specified name in all levels of JSON records that have indefinite number of levels, the Java code will be long and complicated.

You can use SPL, the open-source Java package, to do this. It is easy and only one line of code is enough:

A

1

=json(file("data.json").read()).groups(#4.#3;count(~)).("selected.Fast:\""/#1/"\"->   occurred -"/#2/"times")

 

SPL offers JDBC driver to be invoked by Java. Just store the above SPL script as count.splx and invoke it in Java as you call a stored procedure:

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

st = con.prepareCall("call count()");
st.execute();

View SPL source code.