1.IDEA 中安装antl 4 插件
2.
/** Taken from "The Definitive ANTLR 4 Reference" by Terence Parr */
// Derived from http://json.org
grammar JSON;
json
: value EOF
;
obj
: '{' pair (',' pair)* '}'
| '{' '}'
;
pair
: STRING ':' value
;
arr
: '[' value (',' value)* ']'
| '[' ']'
;
value
: STRING
| NUMBER
| obj
| arr
| 'true'
| 'false'
| 'null'
;
STRING
: '"' (ESC | SAFECODEPOINT)* '"'
;
fragment ESC
: '\\' (["\\/bfnrt] | UNICODE)
;
fragment UNICODE
: 'u' HEX HEX HEX HEX
;
fragment HEX
: [0-9a-fA-F]
;
fragment SAFECODEPOINT
: ~ ["\\\u0000-\u001F]
;
NUMBER
: '-'? INT ('.' [0-9] +)? EXP?
;
fragment INT
: '0' | [1-9] [0-9]*
;
// no leading zeros
fragment EXP
: [Ee] [+\-]? INT
;
// \- since - means "range" inside [...]
WS
: [ \t\n\r] + -> skip
;
fragment 定义终结符
WS 定义终结符
json定义非终结符
IDEA中G4设置
使用代码
String filename ="txt.json";
InputStream in = new FileInputStream(filename);
JsonLexer lexer = new JsonLexer(CharStreams.fromStream(in));
JsonParser parser = new JsonParser(new CommonTokenStream(lexer));
JsonToXml listener = new JsonToXml();
ParseTreeWalker walker = new ParseTreeWalker();
ParseTree tree = parser.json();
walker.walk(listener,tree);
System.out.println(listener.getXML(tree));
package jsonCode;
import jsonToXml.JsonBaseListener;
import jsonToXml.JsonParser;
import org.antlr.v4.runtime.tree.*;
public class JsonToXml extends JsonBaseListener {
public ParseTreeProperty<String> xml = new ParseTreeProperty<>();
//映射
public String getXML(ParseTree ctx){return xml.get(ctx);}
void setXML(ParseTree ctx,String s){xml.put(ctx,s);}
public static String stripQuotes(String s){
if(s == null || s.charAt(0)!='"') return s;
return s.substring(1,s.length()-1);
}
@Override
public void exitAtom(JsonParser.AtomContext ctx) {
setXML(ctx,ctx.getText());
}
@Override
public void exitString(JsonParser.StringContext ctx) {
setXML(ctx,stripQuotes(ctx.getText()));//退出字符串的时候应该做什么操作
}
@Override
public void exitObjectValue(JsonParser.ObjectValueContext ctx) {
setXML(ctx,getXML(ctx.object()));
}
@Override
public void exitArrayValue(JsonParser.ArrayValueContext ctx) {
setXML(ctx,getXML(ctx.array()));
}
@Override
public void exitPair(JsonParser.PairContext ctx) {
String tag = stripQuotes(ctx.STRING().getText());
JsonParser.ValueContext vct = ctx.value();
String x= String.format("<%s>%s</%s>\n",tag,getXML(vct),tag);
setXML(ctx,x);
}
@Override
public void exitAnObject(JsonParser.AnObjectContext ctx) {
StringBuilder buf = new StringBuilder();
buf.append("\n");
for(JsonParser.PairContext pacts : ctx.pair()){
buf.append(getXML(pacts));
}
setXML(ctx,buf.toString());
}
@Override
public void exitEmptyObject(JsonParser.EmptyObjectContext ctx) {
setXML(ctx,"");
}
@Override
public void exitArrayOfValues(JsonParser.ArrayOfValuesContext ctx) {
StringBuilder buf = new StringBuilder();
buf.append("\n");
for(JsonParser.ValueContext vctx : ctx.value()){
buf.append("<element>");//将所有的元素连接成合法的XML文本
buf.append(getXML(vctx));
buf.append("</element>");
buf.append("\n");
}
setXML(ctx,buf.toString());
}
@Override
public void exitEmptyArray(JsonParser.EmptyArrayContext ctx) {
setXML(ctx,"");
}
@Override
public void exitJson(JsonParser.JsonContext ctx) {
setXML(ctx,getXML(ctx.getChild(0)));
}
}