博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java工作利器之常用工具类(四)——Json工具类,使用正则支持xml与json互转
阅读量:7047 次
发布时间:2019-06-28

本文共 5150 字,大约阅读时间需要 17 分钟。

看到这个题目是不是大部分人都不屑一顾,的确基本上每个java程序猿都写过json工具类,也有很多人都使用json-lib.jar封装过类似的功能,但是我这里使用了正则来支持xml与json的互转,减少了jar包的引入。基本上满足了需求。当然如果你需要更强大的功能,还是最好使用json-lib来实现。
主要看一下工具类中的转换json和转换成xml的方法吧。

1. xml转json

具体就不多说了,我是采用的笨方法,多次使用正则进行替换的。比较好的一点儿是支持xml元素属性。如果xml节点有属性会使用 @attributes:{属性列表} 进行格式化处理。如果有属性只有一个值,那值要采用@value:"值"进行格式化。代码如下:

/**     * 格式化为json格式     *      * @param result     * @return     */    public static String fmt2Json(String result){        if(validate(result)){            return result;        }        result = result.replaceAll(">\\s*<", "><").replaceAll("<\\?([^>|^\\?]*)\\?>", "");        String json = result;        Matcher matcher = Pattern.compile("<([^>|^/]*)>").matcher(result);        while(matcher.find()){            for (int i = 0; i < matcher.groupCount(); i++) {                String s = matcher.group(i+1);                json = json.replaceAll("<"+s+">([^<|^\"]*)
", "\""+s+"\":\"$1\","); } } json = "{"+json.replaceAll(",?
", "},").replaceAll("<([^<]*)>", "\"$1\":{")+"}"; json =json.replaceAll(",}","}").replaceAll("(\\s*\\w*)=\"(\\w*)\"\\s*\"?", "\"$1\":\"$2\",") .replaceAll("\\s+([^{]*),:" , ":{\"@attributes\":{\"$1},").replace("},{", "},") .replaceAll("},([^}|^\"]*)}", "},\"@value\":\"$1\"}"); return json; }

2. json转xml

发现这个网站采用js比较简单,js居然用eval(json)就直接转化为树形对象了。然后就处理简单了。但是用java来模拟还是有点困难,本人也是从内部开始处理,一步一步的往外解析。然后最终简单实现了。当然还是有许多bug吧。刚测试了一下,居然不支持数组的转换。有时间再改改吧。
/**     * 格式化为xml格式     *      * @param json     * @return     */    public static String fmt2Xml(String json){        return fmt2Xml(json, "root");    }    /**     * 格式化为xml格式     *      * @param json     * @param rootEle     * @return     */    public static String fmt2Xml(String json, String rootEle){        if(!validate(json)){            return fmt2Xml(fmt2Json(json),rootEle);        }        rootEle = rootEle.replaceAll("\\W", "");        rootEle = StringsUtil.isNullOrEmpty(rootEle)? "root": rootEle;//        return json.replaceAll("\"(\\w*)\":\"?([^\",}]*)\"?,?","<$1>$2
").replaceAll("\\{([^\\}]*)\\}", "
<"+rootEle+">$1"+"
"); //去掉@attributes和@value Pattern pattern = Pattern.compile("\"@attributes\":\\{([^}]*)}"); Matcher matcher = pattern.matcher(json); int t =0; while(matcher.find()){ t++; String s = ""; for (int i = 0; i < matcher.groupCount(); i++) { s = matcher.group(i+1); s = s.replaceAll("\"(\\w*)\":\"([^\"]*)\",?", " $1=$2"); } json = json.replaceAll("[^,]\"(\\w*)\":\\{\"@attributes\":\\{[^}]*},?","{\"$1"+s+"\":{"); //matcher = pattern.matcher(json); } json = json.replaceAll("\\{\"@value\":\"([^\"]*)\"}", "\"$1\""); //处理嵌套 json = json.replaceAll("\"([\\w|\\s|=]*)\":\"([^\",{}]+)\",?", "<$1>$2
"); pattern = Pattern.compile("\"(\\w*)\":\\{([^{}]*)},?"); while(pattern.matcher(json).find()){ json = pattern.matcher(json).replaceAll("<$1>$2
"); } pattern = Pattern.compile("\"([\\w|\\s|=]*)\":([^}\"]*)},?"); while(pattern.matcher(json).find()){ json = pattern.matcher(json).replaceAll("<$1>$2
"); } json = json.replaceAll("(\\w*)=(\\w*)", "$1=\"$2\"").replaceAll("/(\\w*)\\s[\\w*)=\"\\w*\"\\s?]*", "/$1").replaceAll("[{|}]", ""); json = "
<"+rootEle+">"+json+"
"; return json; }
来一个main方法测试测试吧:

public static void main(String[] args) {        String str = "
" + "
201
" + "
201
APP被用户自己禁用
" + "
201
APP被用户自己禁用
" + "
" + "
201
APP被用户自己禁用
" + "
" + "
APP被用户自己禁用,请在控制台解禁
" + "
201
APP被用户自己禁用
" + "
"; String json = fmt2Json(str); String xml = fmt2Xml(json); System.out.println("xml转化为json:" + json); System.out.println("json转化为xml:" + xml); }
测试结果如下:
xml转化为json:{"Response":{"@attributes":{"a":"123","b":"000"},"status":{"@attributes":{"c":"123","d":"000"},"@value":"201"},"A":{"status1":"201","message1":"APP被用户自己禁用"},"A2":{"status1":"201","message1":"APP被用户自己禁用"},"B":{"BB":{"status1":"201","message1":"APP被用户自己禁用"}},"message":"APP被用户自己禁用,请在控制台解禁","C":{"status1":"201","message1":"APP被用户自己禁用"}}}json转化为xml:
201
201
APP被用户自己禁用
201
APP被用户自己禁用
201
APP被用户自己禁用
APP被用户自己禁用,请在控制台解禁
201
APP被用户自己禁用
可以自行测试,然后到 和  来检测结果中的json格式和xml格式。

转载地址:http://rzuol.baihongyu.com/

你可能感兴趣的文章
单引号转义时load_file/outfile 生成一句话
查看>>
js的正则处理
查看>>
两日公开课:伯克利深度强化学习训练营 | 视频+PPT
查看>>
通过DockerFile创建ssh服务镜像
查看>>
windows server 2008中关于网络的进阶设定
查看>>
Python 并发编程(一)之线程
查看>>
苹果 vs AMD 高低互现
查看>>
手把手教你用C#打包应用程序(安装程序)
查看>>
软件架构设计模式简述
查看>>
模块化安装与删除openstack的dev(control、compute)与folsom(control)版本
查看>>
ISA系列之ISA Server 2004 中的新增功能--利用多个网络
查看>>
设计Unix下木马程序
查看>>
任务栏出现两个重复图标的解决办法
查看>>
AlphaZero完胜三大世界冠军棋类程序:5000个TPU、自学一天
查看>>
centos 查看每天应用程序的iowait
查看>>
.Net Micro Framework研究—中文显示
查看>>
修改虚拟机MAC地址的方法
查看>>
WINDOWS7更改访问windows共享的用户名和密码
查看>>
Mac下好用的批量文件扩展名修改工具
查看>>
配置gitlab环境实现代码管理及Web Hook测试和ldap认证
查看>>