项目代码: https://download.youkuaiyun.com/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"
}]
}
输出如下: