package com.roid.logparse.utils; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.stream.IntStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.roid.logparse.consts.Consts; public class KeyParseUtil { static { if (System.getProperty("log_name") == null) { System.setProperty("log_name", Consts.DEFAULT_LOG_NAME); } } private static final Logger log = LoggerFactory.getLogger(KeyParseUtil.class); private static final int DEPTH_LIMIT = 4; public static List<String> parseKeys(String jsonStr) { List<String> keys = new ArrayList<String>(); Gson gs = new Gson(); JsonElement el = gs.fromJson(jsonStr, JsonElement.class); JsonObject json = el.getAsJsonObject(); keys = getJsonKeys(keys, json, ".", 1); return keys; } private static List<String> getJsonKeys(List<String> keys, JsonObject json, String hd, int depth) { if (json == null) { return null; } if (!".".equals(hd)) { hd = hd + "."; } for (Map.Entry<String, JsonElement> entry : json.entrySet()) { // if (depth >= DEPTH_LIMIT) { // if (entry.getKey() != null && !"".equals(entry.getKey().trim()) // && !keys.contains(hd + entry.getKey())) { // keys.add(hd + entry.getKey()); // } // continue; // } if (entry.getValue().isJsonObject() && depth < DEPTH_LIMIT) { getJsonKeys(keys, entry.getValue().getAsJsonObject(), hd + entry.getKey(), ++depth); } else { if (entry.getKey() != null && !"".equals(entry.getKey().trim()) && !keys.contains(hd + entry.getKey())) { keys.add(hd + entry.getKey()); } } } return keys; } public static void main(String[] args) { String[] jsonStr = { "{\"glossary\":{\"title\":\"example glossary\",\"GlossDiv\":{\"title\":\"S\",\"GlossList\":{\"GlossEntry\":{\"ID\":\"SGML\",\"SortAs\":\"SGML\",\"GlossTerm\":\"Standard Generalized Markup Language\",\"Acronym\":\"SGML\",\"Abbrev\":\"ISO 8879:1986\",\"GlossDef\":{\"para\":\"A meta-markup language, used to create markup languages such as DocBook.\",\"GlossSeeAlso\":[\"GML\",\"XML\"]},\"GlossSee\":\"markup\"}}}}}", }; ForkJoinPool fjpool = new ForkJoinPool(3); try { fjpool.submit(() -> { IntStream.range(0, 1).parallel().forEach(idx -> { List<String> arrStr = KeyParseUtil.parseKeys(jsonStr[idx]); for (String key : arrStr) { System.out.println(idx + ":" + key); } System.out.println(idx + ": length[" + arrStr.size() + "]," + Thread.currentThread().getName()); }); }).get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }