实现功能:构建一个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. vue学习(2)-过滤器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. http协议:http请求、http响应、间隔时间跳转页面、禁用浏览器缓存

    转自:https://blog.csdn.net/u013372487/article/details/46991623 http协议 1. http协议是建立在  tcp/ip协议基础上. 2. 我 ...

  3. latex中文环境配置(针对北大模板,开题报告+中期答辩+毕业论文)

    最近自己在忙着开题,中文环境真的是emm 以下只针对北大的毕业论文模板,至于其他的中文环境没有尝试 主要是用不同的latex编辑器会报不同的错误,当然我最后还是统一成了pdflatex,经过无数次尝试 ...

  4. Cannot assign to read only property 'exports' of object at webpack ....BaseClient

    网上找了很多资料说是import和export不能一起用,改代码 其实根本原因是es6和es5混合使用造成的兼容性问题 只需要配置.babelrc就可以了 首先安装 npm install -D tr ...

  5. bizcharts在火狐上的Invalid date报错

    bizcharts在火狐上的Invalid date报错,是因为 bizcharts 所用到的 fecha在 火狐上 只能接收日期对象类型的日期,不能接收日期字符串.

  6. kali安装开启ssh & 安装docker

    ssh相关 一.配置SSH参数 . 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication no的注释去掉,并且将N ...

  7. Java注解【三、注解的分类】

    按运行机制分 源码注解 只在源码中存在 编译时注解 在class中依然存在,如@Deprecated 运行时注解 运行阶段起作用,如@Autowired 按来源分 JDK自带注解 三方注解 最常见 自 ...

  8. Oracle【账户管理】

    Oracle学习大致体系oracle管理系统介绍(客户端和服务器端的交互模式)oracle数据库的数据管理(增删改查 查询)oracle账户管理oracle二维表管理   --创建表   --维护表  ...

  9. 利用协程和socket实现并发

    服务端代码 from gevent import monkey monkey.patch_all() from gevent import spawn import socket def commun ...

  10. [工具] fierce--子域收集

    简介 fierce 是使用多种技术来扫描目标主机IP地址和主机名的一个DNS服务器枚举工具.运用递归的方式来工作.它的工作原理是先通过查询本地DNS服务器来查找目标DNS服务器,然后使用目标DNS服务 ...