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

前几天,公司要实现接口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));
}
}
}
}
}




在此记录一下。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XMLJSON是两种常用的数据传输格式XML是可扩展标记语言(Extensible Markup Language)的缩写,它使用标记来表示数据的结构和内容。XML解析通常包括解析器和DOM或SAX两种解析方式,其中DOM方式将整个XML文档加载到内存中,以树结构的形式表示,而SAX方式则是在解析过程中逐行读取XML文档并触发相应的事件。 JSON是JavaScript对象表示法(JavaScript Object Notation)的缩写,它是一种轻量级的数据交换格式JSON使用简洁的键值对的形式来表示数据,并且易于阅读和编写。在解析JSON格式数据时,可以使用各种编程语言中提供的JSON库或框架,如Java中的Gson或FastJson。这些库可以将JSON字符串解析为对象或将对象转换为JSON字符串。 XMLJSON都有各自的优缺点。XML的优点是结构清晰,可扩展性强,适用于复杂的数据结构。但是XML的缺点是冗余性较高,数据量较大,解析速度相对较慢。JSON的优点是体积小,解析速度快,适合在网络传输中使用。然而,JSON的缺点是可读性较差,不支持注释。 在项目中,XMLJSON格式的数据解析常用于数据交换和传输。通过解析XMLJSON格式的数据,我们可以获取并处理其中的内容,从而实现对数据的操作和分析。具体使用哪种格式取决于项目需求和技术栈的选择。例如,如果项目需要与其他系统进行数据交互,可能会使用XML格式;如果项目使用的是前端框架或后端语言支持JSON格式,那么可能会选择使用JSON格式进行数据解析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [XMLJSON格式数据解析方法](https://blog.csdn.net/qq_35523015/article/details/81053662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [jsonxml格式数据的解析(java代码+相关的jar包)](https://download.csdn.net/download/zdd1065493823/10335380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [XMLJSON 解析教程](https://blog.csdn.net/weixin_44715733/article/details/114749650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值