Antlr4解析Json

项目代码:  https://download.csdn.net/download/sjhuangx/11868689

 

Antlr4的json语法如下:

/**
 * Json parser
 */
grammar Json;

json    : object
        | array
        ;

object
        : '{' pair (',' pair)* '}'  # AnObject
        | '{' '}'                   # EmptyObject // 空对象
        ;

array : '[' value (',' value)* ']'  # ArrayOfValues
      | '[' ']'                     # EmptyArray // 空数组
      ;

pair    : STRING ':' value;

value   : STRING  # String
        | NUMBER  # Atom
        | object  # ObjectValue  // 对象递归调用
        | array   # ArrayValue  // 数组递归调用
        | 'true'  # Atom  // 关键字
        | 'false' # Atom
        | 'null'  # Atom
        ;

// JSON 字符串定义
STRING  : '"' (ESC | ~["\\])* '"';

fragment ESC     : '\\' (["\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX     : [0-9a-fA-F] ;

// JSON 数字定义
NUMBER  : '-'? INT '.' INT EXP?  // 1.35, 1.35E-9, 0.3, -4.5
        | '-'? INT EXP          // 1e10, -3e4
        | '-'? INT              // -3, 45
        ;
fragment INT : '0' | [1-9] [0-9]* ; // 除0外的数字不允许0开始
fragment EXP :  [Ee] [+\-]? INT ; // \-是对-的转义, 因为[...] 中的-用于表达"范围"语义


// JSON 空白字符定义
WS : [ \t\n\r]+ -> skip;

JsonNode节点的定义如下

package json.bean;

public abstract class JsonNode {

    public boolean isObject() {
        return false;
    }

    public boolean isArray() {
        return false;
    }

    public boolean isBool() {
        return false;
    }

    public boolean isString() {
        return false;
    }

    public boolean isInt() {
        return false;
    }

    public boolean isDouble() {
        return false;
    }

    public boolean isNull() {
        return false;
    }

    public abstract NodeType getNodeType();
}

ObjectNode 定义如下:

package json.bean;

import java.util.LinkedHashMap;
import java.util.Map;

public class ObjectNode extends JsonNode {

    private Map<String, JsonNode> _children;

    public ObjectNode() {
        _children = new LinkedHashMap<>();
    }

    @Override
    public boolean isObject() {
        return true;
    }

    @Override
    public NodeType getNodeType() {
        return null;
    }

    public JsonNode get(String key) {
        return _children.get(key);
    }

    public void set(String key, JsonNode value) {
        _children.put(key, value);
    }

    @Override
    public String toString() {
        StringBuilder buf = new StringBuilder();
        buf.append('{');
        _children.forEach((k, v) -> buf.append(k).append(": ").append(v).append(","));
        if (!_children.isEmpty()) {
            buf.deleteCharAt(buf.length() - 1);
        }
        buf.append('}');
        return buf.toString();
    }
}

ArrayNode定义如下:

package json.bean;

import java.util.ArrayList;
import java.util.List;

public class ArrayNode extends JsonNode {

    private final List<JsonNode> _children;

    public ArrayNode() {
        _children = new ArrayList<>();
    }

    @Override
    public boolean isArray() {
        return true;
    }

    @Override
    public NodeType getNodeType() {
        return null;
    }

    public JsonNode get(int index) {
        return _children.get(index);
    }

    public void add(JsonNode value) {
        _children.add(value);
    }

    @Override
    public String toString() {
        StringBuilder buf = new StringBuilder();
        buf.append('[');
        if (!_children.isEmpty()) {
            buf.append(_children.get(0));
        }
        for (int i = 1; i < _children.size(); i++) {
            buf.append(",").append(_children.get(i));
        }
        buf.append("]");
        return buf.toString();
    }
}

NodeType定义如下:

package json.bean;

public enum  NodeType {

    BOOL,
    OBJECT,
    ARRAY,
    STRING,
    INT,
    DOUBLE,
    NULL;

    private NodeType() {

    }
}

StringNode定义如下:

package json.bean;

public class StringNode extends JsonNode {

    private String value;

    public StringNode() {
    }

    public StringNode(String value) {
        this.value = value;
    }

    @Override
    public boolean isString() {
        return true;
    }

    @Override
    public NodeType getNodeType() {
        return NodeType.STRING;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}

IntNode定义如下:

package json.bean;

public class IntNode extends JsonNode {

    private int value;

    public IntNode() {

    }

    public IntNode(int value) {
        this.value = value;
    }

    @Override
    public boolean isInt() {
        return true;
    }

    @Override
    public NodeType getNodeType() {
        return NodeType.INT;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return Integer.toString(value);
    }
}

JsonNodeFactory 是一个用于生成json节点的工具类,内容如下

package json.bean;

public class JsonNodeFactory {

    public ObjectNode objectNode() {
        return new ObjectNode();
    }

    public ArrayNode arrayNode() {
        return new ArrayNode();
    }

    public BoolNode boolNode(boolean value) {
        return BoolNode.valueOf(value);
    }

    public IntNode intNode() {
        return new IntNode();
    }

    public IntNode intNode(int value) {
        return new IntNode(value);
    }

    public DoubleNode doubleNode() {
        return new DoubleNode();
    }

    public DoubleNode doubleNode(double value) {
        return new DoubleNode(value);
    }

    public NullNode nullNode() {
        return NullNode.getInstance();
    }

    public StringNode stringNode() {
        return new StringNode();
    }

    public StringNode stringNode(String value) {
        return new StringNode(value);
    }
}

 

使用Visitor解析并构造Json,定义如下:

package json;

import json.bean.ArrayNode;
import json.bean.JsonNode;
import json.bean.JsonNodeFactory;
import json.bean.ObjectNode;

public class MyJsonVisitor extends JsonBaseVisitor<JsonNode> {

    public JsonNode jsonNode;
    private JsonNodeFactory nodeFactory;

    public MyJsonVisitor() {
        jsonNode = null;
        nodeFactory = new JsonNodeFactory();
    }

    @Override
    public JsonNode visitJson(JsonParser.JsonContext ctx) {
        if (ctx.object() != null) {
            jsonNode = visit(ctx.object());
        } else if (ctx.array() != null) {
             jsonNode = visit(ctx.array());
        }
        return jsonNode;
    }

    @Override
    public JsonNode visitAnObject(JsonParser.AnObjectContext ctx) {
        ObjectNode objectNode = nodeFactory.objectNode();
        for (JsonParser.PairContext pairContext : ctx.pair()) {
            JsonNode value = visit(pairContext.value());
            objectNode.set(pairContext.STRING().getText(), value);
        }
        return objectNode;
    }

    @Override
    public JsonNode visitEmptyObject(JsonParser.EmptyObjectContext ctx) {
        return nodeFactory.objectNode();
    }

    @Override
    public JsonNode visitArrayOfValues(JsonParser.ArrayOfValuesContext ctx) {
        ArrayNode arrayNode = nodeFactory.arrayNode();
        for (JsonParser.ValueContext valueContext : ctx.value()) {
            JsonNode value = visit(valueContext);
            arrayNode.add(value);
        }
        return arrayNode;
    }

    @Override
    public JsonNode visitEmptyArray(JsonParser.EmptyArrayContext ctx) {
        return nodeFactory.arrayNode();
    }

    @Override
    public JsonNode visitPair(JsonParser.PairContext ctx) {
        return super.visitPair(ctx);
    }

    @Override
    public JsonNode visitString(JsonParser.StringContext ctx) {
        return nodeFactory.stringNode(ctx.getText());
    }

    @Override
    public JsonNode visitAtom(JsonParser.AtomContext ctx) {
        if (ctx.NUMBER() != null) {
            String text = ctx.NUMBER().getText();
            try {
                int value = Integer.parseInt(text);
                return nodeFactory.intNode(value);
            } catch (Exception ignored) {
            }
            double value = Double.parseDouble(ctx.NUMBER().getText());
            return nodeFactory.doubleNode(value);
        } else if (ctx.getText().equals("true")) {
            return nodeFactory.boolNode(true);
        } else if (ctx.getText().equals("false")) {
            return nodeFactory.boolNode(false);
        } else {
            return nodeFactory.nullNode();
        }
    }

    @Override
    public JsonNode visitObjectValue(JsonParser.ObjectValueContext ctx) {
        return super.visitObjectValue(ctx);
    }

    @Override
    public JsonNode visitArrayValue(JsonParser.ArrayValueContext ctx) {
        return super.visitArrayValue(ctx);
    }
}

Json测试内容

{
  "a": "b",
  "c": [1,2,3],
  "d": {
    "name": "test",
    "age": 19,
    "email": "test@email.com"
  },
  "attrs": [{
    "key": "name",
    "type": "string"
  }, {
    "key": "age",
    "type": "int"
  }, {
    "key": "email",
    "type": "string"
  }]
}

输出如下:

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值