把json的数据格式通过DOM解析创建xml的数据转换

把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 的判断比较复杂.
以上是我个人代码不足之处还希望大家指教.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值