Json格式对象转换为XML

处理Json的包:javax.json
编制XML的包:org.jdom

使用rest接口从前端获取Json格式的对象

@Path("Testrest")
public class TestRest extends ApiBase {
    @POST 
    @Path("rest")
    @Consumes(MediaType.APPLICATION_JSON)
    public Document parseJson(JsonObject jsonData) {
    }
}

访问URL:http://tseg4:9080/rest1/api/Testrest/rest

1. 有效的JSON格式

已定义的JSON语法(参看RFC 4627)中的介绍:

  • JSON对象封装在大括号内{ }。空对象可以表示为{ }
  • 数组封装在方括号内[ ]。空数组可以表示为 [ ]
  • 成员由一个键-值对代表
  • 成员中的键名应该使用双引号括起来
  • 每个成员都应该有一个对象结构中唯一的键
  • 值如果是字符串,则表示括在双引号中
  • 布尔值使用小写true或false表示
  • 数字使用双精度浮点格式表示;支持科学记数法形式;数字前不应该有零
  • “攻击(冲突)”(像单、双引号、大、中括号等)性质的字符必须使用反斜杠进行转义
  • 空值由小写null表示
  • 其它类型,如日期,(JSON)本身不支持,应该由解析器/客户端处理转换为字符串
  • 对象或数组每个成员后面必须跟一个逗号,如果它不是最后一个的话
  • 常见的JSON文件扩展名是.json
  • JSON文件的MIME类型为application/json

参考链接:http://wiki.freepascal.org/JSON/zh_CN

2. Json对象

{
    "modules":[
                {
                    "id":"jsPlumb_2_2",
                    "ename":"PI",
                    "classtype":"submittest.submittestRunner",
                    "showclass":"submittest.submittest",
                    "offsetTop":50,
                    "offsetLeft":360,
                    "params":{
                        "srcpath":"tert"
                    }
                },
                {
                    "id":"jsPlumb_2_13",
                    "ename":"WordCount",
                    "classtype":"com.zte.pgm.bspalgorithm.wordcount.wordCountRunner",
                    "showclass":"wordcount.wordCountNode",
                    "offsetTop":50,
                    "offsetLeft":192,
                    "params":{
                        "srcpath":"fert",
                        "dstpath":"tert"
                    }
                }
            ],
    "connections":[
                    {
                        "id":"con_19",
                        "sourceId":"jsPlumb_2_13",
                        "targetId":"jsPlumb_2_2"
                    }
                ]
}

3. 对Json对象进行遍历

JsonArray arrayM = jsonData.getJsonArray("modules");
int length = arrayM.size();
for (int i = 0; i < length; i ++) {
    JsonObject object = arrayM.getJsonObject(i);
    this.name = object.getString("ename");
    this.label = object.getString("id");
    this.classtype = object.getString("classtype");
    this.showclass = object.getString("showclass"); 
    this.y = object.getString("offsetTop");
    this.x = object.getString("offsetLeft");                    
}

4. 编制XML

注意:
若不对XML进行设置,生成的文件默认为UTF-8编码,并且没有缩进。应当用Format对象进行设置。

XMLOutputter out;     
Format format = Format.getCompactFormat();     
format.setEncoding("gb2312"); //setEncoding就是设置编码了    
format.setIndent("\t"); //setIndent是设置分隔附的意思,一般都是用空格,就是当你新节点后,自动换行并缩进,有层次感,如果这样写setIndent(""),就只有换行功能,而不会缩进了,如果写成setIndent(null),这样就即不换行也不缩进,全部以一行显示了,默认的就是这样的效果,不好看。    
out = new XMLOutputter(format);     
out.output(xmlDoc, new FileOutputStream("xml文件路径"));

5. 代码示例

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonValue;

import org.jdom.Document;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class TestRest extends ApiBase {

    public void genXML() {
        JsonObject jsonData = Json.createObjectBuilder()
        .add("modules", Json.createArrayBuilder()
            .add(Json.createObjectBuilder()
                .add("id", "jsPlumb_2_2")
                .add("ename", "PI")
                .add("classtype", "submittest.submittestRunner")
                .add("showclass", "submittest.submittest")
                .add("offsetTop", "50")
                .add("offsetLeft", "360")
                .add("params", Json.createObjectBuilder()
                    .add("srcpath", "tert")
                    .add("dstpath", "tert")
                )
            )
            .add(Json.createObjectBuilder()
                .add("id", "jsPlumb_2_13")
                .add("ename", "WordCount")
                .add("classtype", "com.zte.pgm.bspalgorithm.wordcount.wordCountRunner")
                .add("showclass", "wordcount.wordCountNode")
                .add("offsetTop", "50")
                .add("offsetLeft", "192")
                .add("params", Json.createObjectBuilder()
                    .add("srcpath", "fert")
                    .add("dstpath", "tert")
                )
            )
        )
        .add("connections", Json.createArrayBuilder()
            .add(Json.createObjectBuilder()
                .add("id", "con_19")
                .add("sourceId", "jsPlumb_2_13")
                .add("targetId", "jsPlumb_2_2")
            )
        ).build();

        String data = jsonData.toString();
        System.out.println(data);

        org.jdom.Element rootElement = new org.jdom.Element("Object");
        Document doc = new Document(rootElement);

        org.jdom.Element modules = new org.jdom.Element("Object");
        modules.setAttribute("classtype", "java.util.Vector");
        modules.setAttribute("name", "0");      
        doc.getRootElement().addContent(modules);

        JsonArray arrayM = jsonData.getJsonArray("modules");
        int length = arrayM.size();
        for (int i = 0; i < length; i ++) {
            JsonObject object = arrayM.getJsonObject(i);
            String name = object.getString("ename");
            String label = object.getString("id");
            String classtype = object.getString("classtype");
            String showclass = object.getString("showclass");   
            String y = object.getString("offsetTop");
            String x = object.getString("offsetLeft");          

            org.jdom.Element objectElement = new org.jdom.Element("Object");
            modules.addContent(objectElement);
            objectElement.setAttribute("name", name);
            objectElement.setAttribute("label", label);
            objectElement.setAttribute("classtype", classtype);
            objectElement.setAttribute("showclass", showclass);
            objectElement.setAttribute("x", x);
            objectElement.setAttribute("y", y);

            org.jdom.Element panelElement = new org.jdom.Element("Panel");
            objectElement.addContent(panelElement);
            JsonObject attribute = object.getJsonObject("params");
            for(Map.Entry map : attribute.entrySet()) {
                String attrName = map.getKey();
                String attrValue = map.getValue().toString().substring(1, map.getValue().toString().length() - 1);

                System.out.println(attrName);
                System.out.println(attrValue);

                org.jdom.Element attributeElement = new org.jdom.Element("Attribute");
                attributeElement.setAttribute("name", attrName);
                attributeElement.setAttribute("value", attrValue);
                panelElement.addContent(attributeElement);

            }           
        }


        org.jdom.Element connectionsElement = new org.jdom.Element("Object");
        rootElement.addContent(connectionsElement);
        connectionsElement.setAttribute("classtype", "java.util.Vector");
        connectionsElement.setAttribute("name", "1");

        JsonArray arrayL = jsonData.getJsonArray("connections");
        length = arrayL.size();

        String src = null;
        String dst = null;
        HashMap map = new HashMap();
        for(int i = 0; i < length; i ++) {
            JsonObject line = arrayL.getJsonObject(i);
            src = line.getString("sourceId");
            dst = line.getString("targetId");
            map.put(dst, src);
        }
        while(true) {
            if(map.containsKey(src))
                src = map.get(src);
            else
                break;
        }

        org.jdom.Element lineElement = new org.jdom.Element("line");
        connectionsElement.addContent(lineElement);
        lineElement.setAttribute("name", "line0");
        lineElement.setAttribute("fromInco", "FlowIcon0");
        lineElement.setAttribute("toInco", src);
        for(int i = 0; i < length; i ++) {
            lineElement = new org.jdom.Element("line");
            connectionsElement.addContent(lineElement);
            JsonObject line = arrayL.getJsonObject(i);
            lineElement.setAttribute("name", line.getString("id"));
            lineElement.setAttribute("fromInco", line.getString("sourceId"));
            lineElement.setAttribute("toInco", line.getString("targetId"));
        }


        File file = new File("d:\\rest.xml");

        try {
            if (!file.exists())
                file.createNewFile();
            FileWriter writer = new FileWriter(file);
            Format format = Format.getCompactFormat();     
            format.setIndent("\t"); //setIndent是设置分隔附的意思,一般都是用空格,就是当你新节点后,自动换行并缩进,有层次感,如果这样写setIndent(""),就只有换行功能,而不会缩进了,如果写成setIndent(null),这样就即不换行也不缩进,全部以一行显示了,默认的就是这样的效果,不好看。
            XMLOutputter out = new XMLOutputter(format);
            out.output(doc, writer);
            System.out.println("success");      
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestRest test = new TestRest();
        test.genXML();
    }
}

6. 几种解析XML方式的比较

三种操作xml的方式,分别是:
Dom4j解析和生成XML文档, 地址:http://blog.csdn.net/chenghui0317/article/details/11486271
Dom解析和生成XML文档, 地址:http://blog.csdn.net/chenghui0317/article/details/11662667
SAX解析和生成XML文档, 地址:http://blog.csdn.net/chenghui0317/article/details/11990891

  • Dom4j的xml解析性能最好,目前有许多开源项目都在使用Dom4j解析xml文档,比如hibernate,另外Dom4j解析的时候采用面向对象,所有的节点都是用Element封装之后返回,非常方便使用和调用;

  • SAX解析xml性能较好,因为它是采用DefaultHandler事件处理者来解析的,但是不好的地方在于每一个节点的名称,属性和内容都被分开了,也没有使用对象封装,所以在解析之后封装对象上面比较麻烦,稍微不注意就会使空文本覆盖掉应该存放的值;

  • JDom在解析xml性能上表现不是很好,虽然JDom 和
    Dom4j在解析上有很多相似之后,大多差距都是方法名称不同但是具体含义相同,所以使用起来还是蛮方便的;

  • Dom在解析xml性能上表现也不是很好,另外Dom在解析xml使用的时候感觉是最不方便的,Dom并没有把解析的节点封装成对象,并且很容易受到非空内容的节点影响,导致解析抛异常。

参考链接:http://blog.csdn.net/chenghui0317/article/details/12137845

你可能感兴趣的:(Json,xml)