处理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)中的介绍:
参考链接: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