ANTLR4将JSON翻译成XML
实现功能:构建一个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的更多相关文章
- ANTLR4将BF翻译成CPP
实验环境: 操作系统:windows 10 JAVA:JDK 1.8 antlr:antlr-4.7.1-complete.jar IDE:IntelliJ IDEA 2017.2.7 实验目的: 实 ...
- 怎样用Google APIs和Google的应用系统进行集成(5)----怎样把Google Tasks的JSON Schema转换成XML的Schema(XSD)?
前面说了一些Google API的介绍,可是在实际的开发其中,我们可能须要把Google RESTful API返回的JSON数据转换成XML数据输入到第三方系统,这在企业应用集成里面很的常见. 那么 ...
- JSON格式转换成XML格式
第一种方法: 需要使用命名空间System.Runtime.Serialization.Json 下面有JsonReaderWriterFactory XmlDictionaryReader read ...
- Dreamer2.1 发布 新增将Bean解析成xml和json
一个上午,增加两个功能 1.直接将对象解析成XML 2.将对象解析成JSON 对象可以是数组,可以是集合,也可以是单个对象 源码和jar下载地址:http://pan.baidu.com/share/ ...
- 【Flex】读取本地JSON,然后JSON数据转成XML数据
package utils { import flash.xml.XMLDocument; import flash.xml.XMLNode; import mx.rpc.xml.SimpleXMLE ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- 怎样用Google APIs和Google的应用系统进行集成(8)----怎样把Google Blogger(博客)的JSON Schema转换成XML的Schema(XSD)?
在Google RESTFul API中,Google Blogger API(Google博客API)应该和我们的生活离得近期:由于差点儿非常多人每天都在看博客,都在写博客,都听说过博客.在前面的G ...
- PYTHON-模块 json pickle shelve xml
""" pickle 和 shevle 序列化后得到的数据 只有python才能解析 通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互 我们必须保证这个数据 ...
- 常用模块(json/pickle/shelve/XML)
一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...
随机推荐
- day07 类
一.目录 1.模块 2.包 3.isinstance issubclass type 4.方法和函数 5.反射 6.约束 7.继承 8.特殊成员 9.异常处理 补充知识点 10.hashlib模块 1 ...
- js div模拟水平滚动条
这个也是我百度到的,但是忘记保存连接了,现在把代码贴上来,有需要的可以参考一下: <!DOCTYPE html> <html> <head> <meta ch ...
- javascript 元编程之 method_missing
javascript 元编程之 method_missing 引言 要说元编程 ruby 中技巧太多了,今天来写的这个技术也来自于 ruby 中的灵感. method_missing 这个在 ruby ...
- Elasticsearch中Mapping
映射(Mapping) 概念:创建索引时,可以预先定义字段的类型以及相关属性.从而使得索引建立得更加细致和完善.如果不预先设置映射,会自动识别输入的字段类型. 官方文档(字段数据类型):https:/ ...
- QT对话框
QFileDialog:文件对话框 QString fileName=QFileDialog::getOpenFileName(this,"打开文件", "/" ...
- Cordova热更新和App升级
web代码的更新此更新方式,只需要更新web前段代码,不需要更新android的原生代码.只是对js.html等的更新.1.添加插件 Cordova Hot Code Pushcordova plug ...
- HDU - 4992 Primitive Roots (原根)
模板题,可用于求一个数的所有原根. #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f ...
- mysql random 字母大小写和数字
delimiter $$drop function if exists rand_string;create function rand_string(n int) returns varchar(2 ...
- TXNLP 01-09
一般涉及生成文本都是比较难的.
- nodejs+mysql 批量更新
没办法,只能通过循环一次次更新: var updateMysql = function(){ data = excel[0].data; for(var i=1; i<data.length; ...