JsonListener.java 4.03 KB
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<String, JsonElement> json;
    private List<String> 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<String, JsonElement> 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;
    }





}