您的位置:首页 > Web前端 > JavaScript

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

2017-04-28 11:11 363 查看
前几天,公司要实现接口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\
4000
":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));
}
}
}
}
}

在此记录一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  json 动态解析json