package com.ishchuk.antlr.json; import com.ishchuk.antlr.json.model.*; import com.ishchuk.antlr4.JSONgramBaseListener; import com.ishchuk.antlr4.JSONgramParser; import java.util.*; public class JsonListener extends JSONgramBaseListener { private JsonModel jsonFile; private Map json; private List var; private boolean read; @Override public void enterJson(JSONgramParser.JsonContext ctx) { this.jsonFile = new JsonModel(); this.json = new HashMap<>(); this.var = new ArrayList<>(); this.read = true; } public JsonModel getJsonFile() { return this.jsonFile; } @Override public void enterContent(JSONgramParser.ContentContext ctx) { if (read && Objects.nonNull(ctx.object())) { ctx.object().keyValue().forEach(kv -> { JsonElement elem = new JsonElement(); elem.setContent(kv.content()); json.put(kv.CHAINE().getSymbol().getText(), elem); }); read = false; } else { System.out.println("content: " + ctx.getText()); String parent = getParent(ctx); System.out.println("parent: " + parent); if (json.containsKey(parent)) { System.out.println("parent in json"); searchMap(json, parent); } else { System.out.println("NOT in json"); json.values().forEach(kv -> { if (kv instanceof JsonObject) { searchMap(((JsonObject) kv).getMap(), parent); } else if (kv instanceof JsonArray) { ((JsonArray) kv).getArray().forEach(obj -> { searchMap(obj.getMap(), parent); }); } }); } } } private void searchMap(Map json, final String parent) { if (json.containsKey(parent)) { System.out.println("parent in json"); if (json.get(parent).getContent() instanceof JSONgramParser.ContentContext) { JSONgramParser.ContentContext content = (JSONgramParser.ContentContext) json.get(parent).getContent(); if (Objects.nonNull(content.object())) { json.replace(parent, prepareJsonObject(content)); } else if (Objects.nonNull(content.table())) { JsonArray arr = new JsonArray(); content.table().content().forEach(cont -> { JsonObject obj = prepareJsonObject(cont); arr.getArray().add(obj); }); arr.getArray().forEach(temp -> { searchMap(temp.getMap(), parent); }); json.replace(parent, arr); } else { JsonPrimitive prim = new JsonPrimitive(); prim.setValue(content.getText()); json.replace(parent, prim); } } } } private JsonObject prepareJsonObject(JSONgramParser.ContentContext cont) { JsonObject obj = new JsonObject(); cont.object().keyValue().forEach(kv -> { JsonElement elem = new JsonElement(); elem.setContent(kv.content()); obj.getMap().put(kv.CHAINE().getSymbol().getText(), elem); }); return obj; } private String getParent(JSONgramParser.ContentContext ctx) { String parent; if (Objects.nonNull(ctx.table()) || Objects.nonNull(ctx.object())) { if (ctx.getParent().children.get(0).getText().equals("[")) { parent = ctx.getParent().getParent().getParent().children.get(0).getText(); } else { parent = ctx.getParent().children.get(0).getText(); } } else { parent = ctx.getParent().children.get(0).getText(); } return parent; } }