实现功能:构建一个JSON到XML的翻译器。


antlr4文件:

grammar JSON;

json : object
| array
;
object
: '{' pair (',' pair)* '}' # AnObject
| '{' '}' # EmptyObject
;
pair : STRING ':' value ; array
: '[' value (',' value)* ']' # ArrayOfValues
| '[' ']' # EmptyArray
;
value
: STRING # String
| NUMBER # Atom
| object # ObjectValue // recursion
| array # ArrayValue // recursion
| 'true' # Atom // keywords
| 'false' # Atom
| 'null' # Atom
;
STRING : '"' (ESC | ~["\\])* '"' ; fragment ESC : '\\' (["\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [-9a-fA-F] ; NUMBER
: '-'? INT '.' INT EXP? // 1.35, 1.35E-9, 0.3, -4.5
| '-'? INT EXP // 1e10 -3e4
| '-'? INT // -3, 45
; fragment INT : '' | [-] [-]* ; // no leading zeros
fragment EXP : [Ee] [+\-]? INT ; // \- since - means "range" inside [...] WS : [ \t\n\r]+ -> skip ;


JSAON2XML.java文件:

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeProperty;
import org.antlr.v4.runtime.tree.ParseTreeWalker; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; class XMLEmitter extends JSONBaseListener{
public ParseTreeProperty<String> xml = new ParseTreeProperty<String>();
String getXML(ParseTree ctx){
return xml.get(ctx);
} void setXML(ParseTree ctx,String s){
xml.put(ctx, s);
} public void exitAtom(JSONParser.AtomContext ctx) {
setXML(ctx, ctx.getText());
} public void exitArrayValue(JSONParser.ArrayValueContext ctx) {
setXML(ctx,getXML(ctx.array()));
} public void exitString(JSONParser.StringContext ctx) {
setXML(ctx,ctx.getText().replaceAll("\"", ""));
} public void exitObjectValue(JSONParser.ObjectValueContext ctx) {
setXML(ctx,getXML(ctx.object()));
} public void exitPair(JSONParser.PairContext ctx) {
String tag = ctx.STRING().getText().replace("\"", "");
JSONParser.ValueContext vctx = ctx.value();
String x = String.format("<%s>%s<%s>\n",tag,getXML(vctx),tag);
setXML(ctx,x);
} public void exitAnObject(JSONParser.AnObjectContext ctx) {
StringBuilder buf = new StringBuilder();
buf.append("\n");
for(JSONParser.PairContext pctx : ctx.pair()){
buf.append(getXML(pctx));
}
setXML(ctx,buf.toString());
} public void exitEmptyObject(JSONParser.EmptyObjectContext ctx) {
setXML(ctx,"");
} public void exitArrayOfValues(JSONParser.ArrayOfValuesContext ctx) {
StringBuilder buf = new StringBuilder();
buf.append("\n");
for(JSONParser.ValueContext vctx : ctx.value()){
buf.append("<element>")
.append(getXML(vctx))
.append("<element>")
.append("\n");
}
setXML(ctx,buf.toString());
} public void exitEmptyArray(JSONParser.EmptyArrayContext ctx) {
setXML(ctx,"");
} public void exitJson(JSONParser.JsonContext ctx) {
setXML(ctx,getXML(ctx.getChild(0)));
}
} public class JSON2XML {
public static void main(String[] args) throws IOException {
String path = "F:\\IDEA_JAVA\\JSON2XML\\test\\test.json";
CharStream inputStream = CharStreams.fromFileName(path);
JSONLexer lexer = new JSONLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
JSONParser parser = new JSONParser(tokenStream);
ParseTreeWalker walker = new ParseTreeWalker();
XMLEmitter xml = new XMLEmitter();
ParseTree json = parser.json();
walker.walk(xml,json);
System.out.println(xml.xml.get(json));
}
}
/*
注意的是,在一些文法后面用”#”号定义了一个名称,就会在用于访问生成的抽象语法树AST的访问器中生成该方法,用于访问当这个规约被满足时候的那个树节点。
*/

  注:注意的是,在一些文法后面用”#”号定义了一个名称,就会在用于访问生成的抽象语法树AST的访问器中生成该方法,用于访问当这个规约被满足时候的那个树节点。


完整工程

提取码:lu8g

ANTLR4将JSON翻译成XML的更多相关文章

  1. ANTLR4将BF翻译成CPP

    实验环境: 操作系统:windows 10 JAVA:JDK 1.8 antlr:antlr-4.7.1-complete.jar IDE:IntelliJ IDEA 2017.2.7 实验目的: 实 ...

  2. 怎样用Google APIs和Google的应用系统进行集成(5)----怎样把Google Tasks的JSON Schema转换成XML的Schema(XSD)?

    前面说了一些Google API的介绍,可是在实际的开发其中,我们可能须要把Google RESTful API返回的JSON数据转换成XML数据输入到第三方系统,这在企业应用集成里面很的常见. 那么 ...

  3. JSON格式转换成XML格式

    第一种方法: 需要使用命名空间System.Runtime.Serialization.Json 下面有JsonReaderWriterFactory XmlDictionaryReader read ...

  4. Dreamer2.1 发布 新增将Bean解析成xml和json

    一个上午,增加两个功能 1.直接将对象解析成XML 2.将对象解析成JSON 对象可以是数组,可以是集合,也可以是单个对象 源码和jar下载地址:http://pan.baidu.com/share/ ...

  5. 【Flex】读取本地JSON,然后JSON数据转成XML数据

    package utils { import flash.xml.XMLDocument; import flash.xml.XMLNode; import mx.rpc.xml.SimpleXMLE ...

  6. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  7. 怎样用Google APIs和Google的应用系统进行集成(8)----怎样把Google Blogger(博客)的JSON Schema转换成XML的Schema(XSD)?

    在Google RESTFul API中,Google Blogger API(Google博客API)应该和我们的生活离得近期:由于差点儿非常多人每天都在看博客,都在写博客,都听说过博客.在前面的G ...

  8. PYTHON-模块 json pickle shelve xml

    """ pickle 和 shevle 序列化后得到的数据 只有python才能解析 通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互 我们必须保证这个数据 ...

  9. 常用模块(json/pickle/shelve/XML)

    一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...

随机推荐

  1. 内网渗透之frp使用

    0x00 前言 nps相比上次已经介绍过了.但是他有一个致命缺点就是在scks5代理下会长连接一直不放开导致结果不准确.所以来讲讲frp的使用.frp虽然需要落地配置文件,但是扫描的结果还是很准确的. ...

  2. 第五篇python进阶之深浅拷贝

    目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...

  3. Mysql(三)-1:存储引擎

    一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型 ...

  4. C# Winform 带水印提示输入框

    using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms ...

  5. Winfrom UI 美化 MetroModernUI库应用实例

    使用方式: 选择项目==>右键==>管理NuGet安装包==>输入Metro==> ==>添加选项卡(自定义命名,例如Metrol UI)==>浏览 ==>加 ...

  6. Naming Company CodeForces - 794C (博弈,构造)

    Oleg the client and Igor the analyst are good friends. However, sometimes they argue over little thi ...

  7. Python的在线编辑环境

    另外,再提供几个Python的在线编辑环境,可以直接写代码并且运行的环境. 在线Python实验室:http://www.pythoner.cn/labs/ 在线Python编辑器:http://ww ...

  8. JavaScript16进制颜色值和rgb的转换

    //十六进制颜色值域RGB格式颜色值之间的相互转换//十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; /*RGB颜色转换为1 ...

  9. Python之windows锁屏

    简单粗暴,三行代码搞定 from ctypes import * user32 = windll.LoadLibrary('user32.dll') user32.LockWorkStation() ...

  10. C#与数据库有关的控件和属性

    BindingNavigator  数据记录导航 BindingSource 与数据源绑定, 常用属性:DataSource.DataMember 常用方法: DataGridView 以表格形式显示 ...