通过解析xml获得json格式,动态解析json

本文介绍了一种使用XML配置文件来解析复杂JSON数据的方法。通过自定义工具类ContractUtil及解析处理类XmlDemo,实现了从XML中读取配置并解析对应的JSON数据结构,将解析后的数据用于后续业务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天,公司要实现接口api开放平台,因为涉及到多个关联方。如果用bean存储每个关联方的接口。那会写无数个bean。自己研究了下。实现了一个通过配置xml的对应json格式的文件,然后读取,进行解析json数据。吧对应的数据存到数据库,要用的时候再进行取值。

贴上测试数据

xml文件

<?xml version="1.0" encoding="UTF-8"?>
 
<JSONFORMAT>  
   <student type = "list">
   <name type = "single"></name>
    <age type = "single"></age>
    <score type = "single"></score>
<sex type = "single"></sex>    
   </student>
    <chiness type = "map">
    <shiju type = "single"></shiju>
    <yuedu type = "single"></yuedu>
    <zuowen type = "single"></zuowen>
   </chiness>
   <match type = "single"></match>
    
</JSONFORMAT> 




对应要解析的json数据

{
    "student":[
        {
            "score":"98",
            "sex":"女",
            "name":"张三",
            "age":"13"
        },
        {
            "score":"98a",
            "sex":"女a",
            "name":"张三a",
            "age":"13a"
        }
    ],
    "chiness":{
        "yuedu":"90",
        "zuowen":"80",
        "shiju":"100"
    },
    "match":"88"
}



处理通过解析xml文件获得需要解析的参数

ContractUtil.java

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


public class ContractUtil {
public static ArrayList<Map<String,Object>> arraylist = new ArrayList<>(); // 属性容器


public static Document read(String fileName) throws Exception {
SAXReader reader = new SAXReader();
String path = ClassPathUtil.getClassPath(AutoJavaBean.class);
Document document = reader.read(new File(path + "//" + fileName));
System.out.println("配置文件路径:" + path + "//" + fileName);
return document;
}


public static void getInterfaceParam(Element root, int level,String topName) {
for (Iterator i = root.elementIterator(); i.hasNext();) {
Element el = (Element) i.next();
Map<String, Object> maps = new HashMap<>();
maps.put("name", el.getName());
maps.put("level", level);
maps.put("topName", topName);
maps.put("isMap", "map".equals(el.attributeValue("type"))?"Y":"N");
maps.put("isList", "list".equals(el.attributeValue("type"))?"Y":"N");
arraylist.add(maps);
if("map".equals(el.attributeValue("type"))||"list".equals(el.attributeValue("type"))){
getInterfaceParam(el, level + 1,el.getName());
}
}
}


public static void main(String[] args) throws DocumentException {
String fileName = "Contract.xml";
SAXReader reader = new SAXReader();
String path = ClassPathUtil.getClassPath(AutoJavaBean.class);
Document document = reader.read(new File(path + "//" + fileName));
Element root = document.getRootElement();
ContractUtil.getInterfaceParam(root,0,"");
}
}



针对报文进行解析处理类

XmlDemo.java


import java.util.ArrayList;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;


public class XmlDemo {
public static void main(String[] args) throws Exception {
// String json = "{\"returnCode\":\"0000\",\"repayPlan\":[{\"loanNo\":\"1111\",\"payprincipalamt\":20000.0,\"feePlan\":[{\"feeCode\":\"CORPUS\",\"payfeeamt\":220.0}],\"payinteamt\":0.0,\"termAmt\":20000.0,\"termNo\":1,\"loanRate\":4.5,\"payDate\":\"20170427\"}]}";
//String json1 = "{\"returnCode\":\"0000\",\"repayPlan\":[{\"loanNo\":\"1111\",\"payprincipalamt\":20000,\"feePlan\":[{\"feeCode\":\"CORPUS\",\"payfeeamt\":220},{\"feeCode\":\"AAAAA\",\"payfeeamt\":3330}],\"payinteamt\":0,\"termAmt\":20000,\"termNo\":1,\"loanRate\":4.5,\"payDate\":\"20170427\"}]}";
//matchJson(json1);


JSONObject obj = new JSONObject();
obj.put("name", "张三");
obj.put("age", "13");
obj.put("score", "98");
obj.put("sex", "女");


JSONObject obja = new JSONObject();
obja.put("name", "张三a");
obja.put("age", "13a");
obja.put("score", "98a");
obja.put("sex", "女a");


JSONArray obj2 = new JSONArray();
obj2.add(obj);
obj2.add(obja);


JSONObject obja2 = new JSONObject();
obja2.put("shiju", "100");
obja2.put("yuedu", "90");
obja2.put("zuowen", "80");


JSONObject obj1 = new JSONObject();
obj1.put("student", obj2);
obj1.put("chiness", obja2);
obj1.put("match", "88");
System.out.println(obj1);
matchJson(obj1.toJSONString());


}


public static void matchJson(String json) throws Exception {
//String fileName = "Contract.xml";
String fileName = "/resource/Contract2.xml";
Document document = ContractUtil.read(fileName);
Element root = document.getRootElement();
ContractUtil.getInterfaceParam(root, 0, "");

JSONObject jsonObject = JSON.parseObject(json);
matchJsonMap(jsonObject,ContractUtil.arraylist,0,"");

}


/**
* 按xml文件解析json数据库
* 
* @param json    需要解析的json数据
* @param arrayList  获取的json数据格式的层级数据
* @param i            需要循环迭代的起始值(针对list的json)
* @param matchTopName  匹配上级是否一致  避免把非当前list或者map的数据解析出来
*/
public static void matchJsonMap(JSONObject json, ArrayList<Map<String, Object>> arrayList, int i,String matchTopName) {
for (int a = i ; a < arrayList.size(); a++) {
String name = (String) ContractUtil.arraylist.get(a).get("name");
int level = (int) ContractUtil.arraylist.get(a).get("level");
String topName = (String) ContractUtil.arraylist.get(a).get("topName");
String isMap = (String) ContractUtil.arraylist.get(a).get("isMap");
String isList = (String) ContractUtil.arraylist.get(a).get("isList");
if ("Y".equals(isMap)) {
JSONObject o = json.getJSONObject(name);
if (o != null) {
matchJsonMap(o, ContractUtil.arraylist, level,name);
}
}
if ("Y".equals(isList)) {
JSONArray ja = json.getJSONArray(name);
if (ja != null) {
for(int aa = 0; aa < ja.size(); aa++){
matchJsonMap((JSONObject)ja.get(aa), ContractUtil.arraylist, aa,name);
}
}
}
if (matchTopName.equals(topName)) {
if ("N".equals(isMap) && ("N".equals(isList))) {
String value = json.getString(name);
System.out.println("解析的字段名为:" + name + ";解析的值为:" + value + ";父层字段名称:" + topName + ";父层接口层级:"
+ (0 == level ? 0 : level - 1) + ";本层层级:" + (null==topName||"".equals(topName)?level:(i+1) ));
} else {
System.out.println("解析的字段名为:" + name + ";解析的值为:" + " " + ";父层字段名称:" + topName + ";父层接口层级:"
+ (0 == level ? 0 : level - 1) + ";本层层级:" + (i));
}
}
}
}
}




在此记录一下。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值