把json的数据格式通过DOM解析创建xml的数据转换
首先使用的json工具的是 org.json
以前都是用FastJson,刚开始接触这个的是还是绕很多坑.不过最终还是摸一些感觉也是蛮好用的.
先上代码dome.
{“result”:
[{“comments”:
[{“id”:“489ac5ea-c13b-4c6f-8723-25b1956acf32”,
“content”:“這是一篇好文章阿”,
“who”:{“nickname”:“pc”,“id”:“76983229-93c4-45ee-9176-f90497468af2”}},
{“id”:“a827f6a6-44dd-4f25-84bd-1181d415c025”,
“content”:“家惠什麼時候要開始減肥呀”,
“who”:{“nickname”:“pc”,“id”:“76983229-93c4-45ee-9176-f90497468af2”}}],
“emotions”:0,“postedAt”:“2014-02-11T00:00:00+08:00”,
“author”:{“nickname”:“redan”,
“id”:“d23fa0a6-be5d-401b-9763-10440fb15bcc”},
“id”:“7c926954-f637-4dda-82c5-442f868dc006”,
“content”:“this is content 這是一篇文章”}],
“status”:200}
<--------------------------------------------------------第一次对json 返回数据以为不固定的-------------------------------------------->
@RequestMapping(value = “/viewIterator”)
public void viewIterator(HttpServletRequest request,
HttpServletResponse response) throws IOException, ParserConfigurationException, TransformerException {
//创建解析DOM解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
//根元素
Element documentElement = doc.createElement("document");
doc.appendChild(documentElement);
//响应数据
CloseableHttpResponse response1 = HttpClients.createDefault().execute(new HttpGet("https://redan-api.herokuapp.com/story/"));
//返回获取实体
HttpEntity entity = response1.getEntity();
if (entity != null) {
String str = EntityUtils.toString(entity, "UTF-8");
//把这个字符串转成json数组
JSONArray jsonArray = new JSONObject(str).getJSONArray("result");
//拿到第一个对象
JSONObject jsonObject = jsonArray.getJSONObject(0);
//通过第一个对象拿到所有的值
Iterator<String> keys = jsonObject.keys();
//
while (keys.hasNext()) {
//第一层所有key
String next = keys.next();
//拿到对象所对应的key所对应的value
String getKey = jsonObject.get(next).toString();
System.out.println("第一次的所有key-- " + next + "第一次的所有values" + getKey);
// doc.createElement(getKey);
//是文本的情况下
Element element1 = doc.createElement(next);
if (!(getKey.endsWith("}") || getKey.endsWith("]"))) {
//创建第一层的子节点
System.out.println(next + " " + getKey);
element1.setTextContent(getKey);
}
documentElement.appendChild(element1);
if (getKey.endsWith("}")) {
//第二层json对象
JSONObject jsonObject2 = jsonObject.getJSONObject(next);
//json对象的key
Iterator<String> key1 = jsonObject2.keys();
while (key1.hasNext()) {
//拿到所有key
String next1 = key1.next();
String value2 = jsonObject2.getString(next1);
Element element2 = doc.createElement(next1);
element2.setTextContent(value2);
element1.appendChild(element2);
}
} //如果第json是数组
if (getKey.endsWith("]")) {
JSONArray jsonArray1 = jsonObject.getJSONArray(next);
for (int i = 0; i < jsonArray1.length(); i++) {
JSONObject jsonObject2 = jsonArray1.getJSONObject(i);
Iterator<String> key3 = jsonObject2.keys();
while (key3.hasNext()) {
//拿到所有key
String next2 = key3.next();
String value3 = jsonObject2.get(next2).toString();
Element element3 = doc.createElement(next2);
if (!value3.endsWith("}")) {
element3.setTextContent(value3);
}
element1.appendChild(element3);
//判断第三层是否还是json对
if (value3.endsWith("}")) {
JSONObject jsonObject3 = jsonObject2.getJSONObject(next2);
Iterator<String> key4 = jsonObject3.keys();
while (key4.hasNext()) {
String next5 = key4.next();
//通过key拿到对应的valus
String value = jsonObject3.getString(next5);
System.out.println(next5 + " 第三层的的值 " + value);
Element element4 = doc.createElement(next5);
element4.setTextContent(value);
element3.appendChild(element4);
}
}
}
}
}
}
}
//更新到本项目
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(doc), new StreamResult(response.getOutputStream()));
}
<---------------------------------------------------------------华丽分割线-------------------------------------------------->
改进后的代码如下.
访问返回的上面的json 数据. 在controller 的代码如下
@RequestMapping(value = "/getView")
@ResponseBody
public void getView(HttpServletRequest request,
HttpServletResponse response) throws IOException, ParserConfigurationException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
//创建的根元素
Element documentElement = doc.createElement("document");
doc.appendChild(documentElement);
//创建客户端
CloseableHttpResponse response1 = HttpClients.createDefault().execute(new HttpGet("https://redan-api.herokuapp.com/story/"));
//返回字符串实体
HttpEntity entity1 = response1.getEntity();
if (entity1 != null) {
//给返回的实体设置编码
String retSrc = EntityUtils.toString(entity1, "UTF-8");
//获得最外层的元素的是个数组
JSONArray storyList = new JSONObject(retSrc).getJSONArray("result");
// 那么遍历里面的元素取出所有的元素
for (int i = 0; i < storyList.length(); i++) {
//拿到json 每个数组元素判断json数组判断元素是否对象还是数组
JSONObject jsonObject = storyList.getJSONObject(i);
Iterator<String> next1 = jsonObject.keys();
while (next1.hasNext()) {
String next2 = next1.next();
//文本的情况下
Element documentNext2 = doc.createElement(next2);
String teString = jsonObject.get(next2).toString();
if (!(next2.equals("author") || next2.equals("comments"))) {
documentNext2.setTextContent(teString);
}
documentElement.appendChild(documentNext2);
//在comments数组中
if (next2.equals("comments")) {
JSONArray jsonArray = jsonObject.getJSONArray(next2);
//创建标签节点
for (int j = 0; j < jsonArray.length(); j++) {
JSONObject jsonObject3 = jsonArray.getJSONObject(j);
Iterator<String> next3 = jsonObject3.keys();
while (next3.hasNext()) {
String next4 = next3.next();
Element elementNext4 = doc.createElement(next4);
if (!next4.equals("who")) {
String vaString = jsonObject3.getString(next4);
elementNext4.setTextContent(vaString);
}
//根据json 的key 转成对应的xml 的标签
if (next4.equals("who")) {
JSONObject jsonObject4 = jsonObject3.getJSONObject(next4);
Iterator<String> next5 = jsonObject4.keys();
while (next5.hasNext()) {
String next6 = next5.next();
String vaString = jsonObject4.getString(next6);
Element documentNext6 = doc.createElement(next6);
documentNext6.setTextContent(vaString);
elementNext4.appendChild(documentNext6);
}
}
documentNext2.appendChild(elementNext4);
}
}
}
if (next2.equals("author")) {
JSONObject jsonObject5 = jsonObject.getJSONObject(next2);
Iterator<String> next7 = jsonObject5.keys();
while (next7.hasNext()) {
String next8 = next7.next();
String vaString2 = jsonObject5.getString(next8);
//创建节点标签
Element documentNext8 = doc.createElement(next8);
documentNext8.setTextContent(vaString2);
documentNext2.appendChild(documentNext8);
}
}
}
}
}
//更新到本项目
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(doc), new StreamResult(response.getOutputStream()));
}
#转成的xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><comments>
<id>c4087de9-895d-4171-934a-eff811b05e9e</id>
<content>這是一篇好文章阿</content>
<who>
<nickname>pc</nickname>
<id>02c83d70-7720-488b-9e74-43492eeb4a23</id>
</who>
<id>67dac6e9-44dd-4ecc-be85-15673cee95dd</id>
<content>家惠什麼時候要開始減肥呀</content>
<who>
<nickname>pc</nickname>
<id>02c83d70-7720-488b-9e74-43492eeb4a23</id>
</who>
</comments>
<emotions>0</emotions>
<postedAt>2014-02-11T00:00:00+08:00</postedAt>
<author>
<nickname>redan</nickname>
<id>82c8a212-1523-4582-9639-6f2abb8f35bb</id>
</author>
<id>8d89d872-d97d-4e16-b65b-fe21c9bdf74b</id>
<content>this is content 這是一篇文章</content>
所以相比之下都是根据返回的json的固定 数据格式来编写.也比较直观.不要像第一dome 的判断比较复杂.
以上是我个人代码不足之处还希望大家指教.