JsonListener.java 3.47 KB
package com.ishchuk.antlr.json;

import com.ishchuk.antlr.json.model.*;
import com.ishchuk.antlr4.JSONgramBaseListener;
import com.ishchuk.antlr4.JSONgramLexer;
import com.ishchuk.antlr4.JSONgramParser;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

import java.util.*;


public class JsonListener extends JSONgramBaseListener {

    private JsonElement json;
    private boolean read;

    @Override
    public void enterJson(JSONgramParser.JsonContext ctx) {
        this.read = true;


    }

    public JsonElement getJsonFile() {
        return this.json;
    }

    private JsonElement treatContext(JSONgramParser.ContentContext ctx) {

        JsonElement elem;
        if (Objects.nonNull(ctx.object())) {
            elem = new JsonObject();
            for (JSONgramParser.KeyValueContext kv : ctx.object().keyValue()) {
                ((JsonObject)elem).getMap().put(kv.CHAINE().getSymbol().getText(), treatContext(kv.content()));
            }

        } else if (Objects.nonNull(ctx.table())) {
            elem = new JsonArray();
            for (JSONgramParser.ContentContext ct : ctx.table().content()) {
                ((JsonArray)elem).getArray().add(treatContext(ct));
            }
        } else {
            elem = new JsonPrimitive();
            ((JsonPrimitive)elem).setValue(ctx.getText());
        }

        return elem;
    }

    @Override
    public void enterContent(JSONgramParser.ContentContext ctx) {

        if (read) {
            if (Objects.nonNull(ctx.object())) {
                this.json = new JsonObject();
                ctx.object().keyValue().forEach(kv -> {
                    ((JsonObject)this.json).getMap().put(kv.CHAINE().getSymbol().getText(),
                            treatContext(kv.content()));
                });
            } else if (Objects.nonNull(ctx.table())) {
                this.json = new JsonArray();
                ctx.table().content().forEach(ct -> {
                    ((JsonArray)this.json).getArray().add(treatContext(ct));
                });
            }

            read = false;

        }
    }

    public String convertToYml() {
        StringBuilder builder = new StringBuilder();
        builder.append("---\n");
        if (Objects.nonNull(this.json)) {
            builder.append(this.json.toYml(""));
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        System.out.println("Hello! With this application you can convert JSON file to YML file");
        System.out.println("------------------------------------------------------------------");

        Scanner in = new Scanner(System.in);
        System.out.println("Please, copy your json file here");
        String jsonString = "";
        while(in.hasNextLine()){
            jsonString += in.nextLine();
        }

        JSONgramLexer serverJSONgramLexer = new JSONgramLexer(CharStreams.fromString(jsonString));
        CommonTokenStream tokens = new CommonTokenStream( serverJSONgramLexer );
        JSONgramParser JSONgramParser = new JSONgramParser(tokens);
        ParseTreeWalker walker = new ParseTreeWalker();
        JsonListener jsonWalker = new JsonListener();
        walker.walk(jsonWalker, JSONgramParser.json());

        System.out.println("\nYour file:\n");
        System.out.println(jsonWalker.getJsonFile().toString());

        System.out.println("\nYml file:\n");
        System.out.println(jsonWalker.convertToYml());

    }

}