最近开发任务中有一项是将获取到的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数组,但实在没找到好的方法,如果大家有更好的方法,欢迎补充