Xml字符串转Json,并将Json的Key值转大写

本文介绍了如何使用Hutool库将XML字符串转换为JSON对象,并处理JSON键全部转为大写的问题,包括递归处理单个JSON对象和数组中的键转换。
摘要由CSDN通过智能技术生成

最近开发任务中有一项是将获取到的xml请求报文转成Json字符串,并将json中全部的key转为大写存入表中,看着是很简单的一个需求,于是便开始了愉快的敲代码;

1.xml字符串转json对象

首先,是将xml格式的报文转换成json对象
这里我使用的是Hutool类库中的  XML.toJSONObject(String string) 方法
测试后发现可以完美的将xml字符串转换成json字符串,并且只需要一句代码,非常简单方便;具体调用方式如下:

1.1 引入依赖:

<dependency>
       	<groupId>cn.hutool</groupId>
		<artifactId>hutool-all</artifactId>
		<version> 5.7.5</version>
</dependency>

1.2 调用API:

public static void main(String[] args) {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
                "<sxbbbm>1d6e3407-756e-4615-aac0-76ad04caab96</sxbbbm>\n" +
                "<SXBDBM>1077884726221475800</SXBDBM>\n" +
                "<FORM_DATA_ID>1591356212368203948691243</FORM_DATA_ID>\n" +
                "<YWLY>01</YWLY>\n" +
                "<SPRENYUAN></SPRENYUAN>\n" +
                "<SPQIYE>\n" +
                "<ORGNAME></ORGNAME>\n" +
                "<ORGCODE></ORGCODE>\n" +
                "<ORGTYPE>111</ORGTYPE>\n" +
                "<ORGACTUALITY></ORGACTUALITY>\n" +
                "<LEGALPERSON></LEGALPERSON>\n" +
                "</SPQIYE>\n" +
                "<SPXIANGMU></SPXIANGMU>\n" +
                "<SPSHENQIN>\n" +
                "<LIST>\n" +
                "<name>ZhiGongHuiJiaoXinXi</name>\n" +
                "<ID>ZhiGongHuiJiaoXinXi</ID>\n" +
                "<TABLECOLS>\n" +
                "<id>0</id>\n" +
                "<JCJS>4800</JCJS>\n" +
                "<GFRZJHM>22222222</GFRZJHM>\n" +
                "<GRZH>3333333</GRZH>\n" +
                "<YJCE>768</YJCE>\n" +
                "<ZGXM>杨大</ZGXM>\n" +
                "</TABLECOLS>\n" +
                "</LIST>\n" +
                "</SPSHENQIN>\n";
        JSONObject jsonObject = xml2Json(xml);

        System.out.println("xml转换后的json字符串:" + jsonObject);

    }


 public static JSONObject xml2Json(String xml) {
       JSONObject jsonObject = XML.toJSONObject(xml);
       return jsonObject;
 }

1.3 转换结果:

{

    "YWLY": "01",

    "SPRENYUAN": "",

    "SPXIANGMU": "",

    "SXBDBM": 1077884726221475800,

    "SPQIYE": {

        "ORGNAME": "",

        "LEGALPERSON": "",

        "ORGCODE": "",

        "ORGACTUALITY": "",

        "ORGTYPE": 111

    },

    "sxbbbm": "1d6e3407-756e-4615-aac0-76ad04caab96",

    "FORM_DATA_ID": "1591356212368203948691243",

    "SPSHENQIN": {

        "LIST": {

            "name": "ZhiGongHuiJiaoXinXi",

            "TABLECOLS": {

                "JCJS": 4800,

                "ZGXM": "杨大",

                "GFRZJHM": 22222222,

                "GRZH": 3333333,

                "YJCE": 768,

                "id": 0

            },

            "ID": "ZhiGongHuiJiaoXinXi"

        }

    }

}

然后就愉快的开始了将json中的key都转为大写的操作。

2.Json的Key转大写格式

从前面的转换结果中可以看到,json的value也是json,所以在进行大写转换的时候要同时将value中的key也进行大写,也就是所有红色加粗字段,这时候就要使用递归进行处理了:

2.1 Json Key转大写

    public static JSONObject convertKeysToUpperCase(JSONObject json) {
        JSONObject result = new JSONObject();
        for (String key : json.keySet()) {
            Object value = json.get(key);
            //将value取出,判断value是否是JSONObject的实例,如果是,则进行递归处理
            if (value instanceof JSONObject) {
                value = convertKeysToUpperCase((JSONObject) value);
            }
            result.put(key.toUpperCase(), value);
        }
        return result;
    }

最终得到以下输出结果,此时可以发现所有的key都已转换成了大写格式

{

    "YWLY": "01",

    "SPRENYUAN": "",

    "SPXIANGMU": "",

    "SXBBBM": "1d6e3407-756e-4615-aac0-76ad04caab96",

    "SXBDBM": 1077884726221475800,

    "SPQIYE": {

        "ORGNAME": "",

        "LEGALPERSON": "",

        "ORGCODE": "",

        "ORGACTUALITY": "",

        "ORGTYPE": 111

    },

    "FORM_DATA_ID": "1591356212368203948691243",

    "SPSHENQIN": {

        "LIST": {

            "NAME": "ZhiGongHuiJiaoXinXi",

            "TABLECOLS": {

                "JCJS": 4800,

                "ZGXM": "杨大",

                "GFRZJHM": 22222222,

                "GRZH": 3333333,

                "YJCE": 768,

                "ID": 0

            },

            "ID": "ZhiGongHuiJiaoXinXi"

        }

    }

}

是不是到这里就以为万事大吉了?但是实际测试中出现了一种意料外的情况,请看下文

2.2 JsonArray Key转大写

如果原XML报文中某一个标签下存在这种批量的多个数据时,这时使用Hutools工具类将XML转换成Json时会转成Json数组形式;而使用刚刚的递归方法,并不能将Json数组中的Key转为大写,这就导致了业务在将Json转为Map,进行取值时,因为大写不一致,无法取到对应的值

<?xml version="1.0" encoding="UTF-8" ?>
<SXBBBM>1d6e3407-756e-4615-aac0-76ad04caab96</SXBBBM>
<SXBDBM>1077884726221475800</SXBDBM>
<FORM_DATA_ID>1591356212368203948691243</FORM_DATA_ID>
<YWLY>01</YWLY>
<SPRENYUAN></SPRENYUAN>
<SPQIYE>
<ORGNAME></ORGNAME>
<ORGCODE></ORGCODE>
<ORGTYPE>111</ORGTYPE>
<ORGACTUALITY></ORGACTUALITY>
<LEGALPERSON></LEGALPERSON>
</SPQIYE>
<SPXIANGMU></SPXIANGMU>
<SPSHENQIN>
<LIST>
<NAME>ZhiGongHuiJiaoXinXi</NAME>
<ID>ZhiGongHuiJiaoXinXi</ID>
<TABLECOLS>
<ID>0</ID>
<JCJS>4800</JCJS>
<GFRZJHM>22222222</GFRZJHM>
<GRZH>3333333</GRZH>
<YJCE>768</YJCE>
<ZGXM>杨大</ZGXM>
</TABLECOLS>

<TABLECOLS>

<ID>1</ID>
<JCJS>4800</JCJS>
<GFRZJHM>33333333</GFRZJHM>
<GRZH>22222222</GRZH>
<YJCE>768</YJCE>
<ZGXM>孙大</ZGXM>
</TABLECOLS>

</LIST>
</SPSHENQIN>
 

那么怎么办呢?我们还是通过递归方法来进行转换 ,仅需要对之前的方法做下改造即可,使用两次递归,便可以解决以上问题

/**
     * 将json的Key转大写
     */
    public static JSONObject convertKeysToUpperCase(JSONObject json) {
        JSONObject result = new JSONObject();
        for (String key : json.keySet()) {
            Object value = json.get(key);
            if (value instanceof JSONObject) {
                value = convertKeysToUpperCase((JSONObject) value);
            } else if (value instanceof JSONArray) {
                value = convertKeysToUpperCaseInArray((JSONArray) value);
            }
            result.put(key.toUpperCase(), value);
        }
        return result;
    }

    /**
     * 将json数组中的Key都转为大写
     *
     */
    public static JSONArray convertKeysToUpperCaseInArray(JSONArray array) {
        JSONArray resultArray = new JSONArray();
        for (int i = 0; i < array.size(); i++) {
            Object obj = array.get(i);
            if (obj instanceof JSONObject) {
                obj = convertKeysToUpperCase((JSONObject) obj);
            } else if (obj instanceof JSONArray) {
                obj = convertKeysToUpperCaseInArray((JSONArray) obj);
            }
            resultArray.add(obj);
        }
        return resultArray;
    }

结尾:

本来想从XML转换JSON时入手的,将某个标签下的数据不论是单条还是多条,都转为Json数组,但实在没找到好的方法,如果大家有更好的方法,欢迎补充

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值