Java工作利器之常用工具类(四)——Json工具类,使用正则支持xml与json互转

简介: 看到这个题目是不是大部分人都不屑一顾,的确基本上每个java程序猿都写过json工具类,也有很多人都使用json-lib.jar封装过类似的功能,但是我这里使用了正则来支持xml与json的互转,减少了jar包的引入。
看到这个题目是不是大部分人都不屑一顾,的确基本上每个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+">", "\""+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

发现http://www.bejson.com/xml2json/这个网站采用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</$1>").replaceAll("\\{([^\\}]*)\\}", "<?xml version=\"1.0\" encoding=\"utf-8\" ?><"+rootEle+">$1"+"</"+rootEle+">");

        //去掉@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</$1>");
        pattern = Pattern.compile("\"(\\w*)\":\\{([^{}]*)},?");
        while(pattern.matcher(json).find()){
            json = pattern.matcher(json).replaceAll("<$1>$2</$1>");
        }

        pattern = Pattern.compile("\"([\\w|\\s|=]*)\":([^}\"]*)},?");
        while(pattern.matcher(json).find()){
            json = pattern.matcher(json).replaceAll("<$1>$2</$1>");
        }

        json = json.replaceAll("(\\w*)=(\\w*)", "$1=\"$2\"").replaceAll("/(\\w*)\\s[\\w*)=\"\\w*\"\\s?]*", "/$1").replaceAll("[{|}]", "");
        json = "<?xml version=\"1.0\" ?><"+rootEle+">"+json+"</"+rootEle+">";
        return json;
    }
来一个main方法测试测试吧:

    public static void main(String[] args) {
        String str = "<Response a=\"123\" b=\"000\">"
                                + "<status  c=\"123\" d=\"000\">201</status>"
                                + "<A><status1>201</status1><message1>APP被用户自己禁用</message1></A>"
                                + "<A2><status1>201</status1><message1>APP被用户自己禁用</message1></A2>"
                                + "<B>"
                                + "    <BB><status1>201</status1><message1>APP被用户自己禁用</message1></BB>"
                                + "</B>"
                                + "<message>APP被用户自己禁用,请在控制台解禁</message>"
                                + "<C><status1>201</status1><message1>APP被用户自己禁用</message1></C>"
                            + "</Response>";

        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:<?xml version="1.0" ?><root><Response a="123" b="000"><status c="123" d="000">201</status><A><status1>201</status1><message1>APP被用户自己禁用</message1></A><A2><status1>201</status1><message1>APP被用户自己禁用</message1></A2><B><BB><status1>201</status1><message1>APP被用户自己禁用</message1></BB></B><message>APP被用户自己禁用,请在控制台解禁</message><C><status1>201</status1><message1>APP被用户自己禁用</message1></C></Response></root>
可以自行测试,然后到http://www.bejson.com/index.html 和 http://www.bejson.com/otherformat/xml/ 来检测结果中的json格式和xml格式。

目录
相关文章
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
49 1
|
15天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
66 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
4月前
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
70 1
|
27天前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
41 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
3月前
|
XML JSON 数据处理
C# 中的 XML 与 JSON 数据处理
在现代软件开发中,数据交换和存储需求日益增长,XML 和 JSON 成为最常用的数据格式。本文从 C# 角度出发,详细介绍如何处理这两种格式,并提供示例代码。对于 XML,我们介绍了读取、创建和写入 XML 文件的方法;对于 JSON,则展示了如何使用 Newtonsoft.Json 库进行数据解析和序列化。此外,文章还总结了常见问题及其解决方案,帮助开发者更好地应对实际项目中的挑战。
195 61
C# 中的 XML 与 JSON 数据处理
|
2月前
|
XML JSON 数据可视化
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
本文详细介绍了不同数据集格式之间的转换方法,包括YOLO、VOC、COCO、JSON、TXT和PNG等格式,以及如何可视化验证数据集。
265 1
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
159 0
在Java中处理JSON数据:Jackson与Gson库比较
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
147 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
Java
Java 些许公共工具类
Java 些许公共工具类
17 1
|
2月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
138 1