1. 程式人生 > >019.資料交換格式:Json、XML

019.資料交換格式:Json、XML

簡介

資料交換格式中,最核心的就是Json和XML。
其中,Json是一種輕量級資料交換格式,XML是一種重量級的資料交換格式。
相比於xml這種資料交換格式來說,
因為解析xml比較的複雜,而且需要編寫大段的程式碼,
所以客戶端和伺服器的資料交換格式往往通過JSON來進行交換。

常用的json框架為:
fastjson(阿里)、gson(谷歌)、jackson(SpringMVC自帶)
其中,伺服器端開發常用fastjson,安卓開發常用gson。

常用的XML解析方式:
Dom4j、Sax、Pull
其中,dom4j不適合大檔案的解析,因為它是一下子將檔案載入到記憶體中,所以有可能出現記憶體溢位,sax是基於事件來對xml進行解析的,所以他可以解析大檔案的xml,也正是因為如此,所以dom4j可以對xml進行靈活的增刪改查和導航,而sax沒有這麼強的靈活性,所以sax經常是用來解析大型xml檔案,而要對xml檔案進行一些靈活(crud)操作就用dom4j。


fastjson

maven

		<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>fastjson</artifactId>
		    <version>1.2.52</version>
		</dependency>
		
		<!-- lombok是為了使用@Data註解,省去set/get方法 -->
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency>

code

package cn.qbz.thread;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data; import java.util.List; public class Test112001 { public static void main(String[] args) { String str = "{\"name\":\"BeJson\",\"url\":\"http://www.bejson.com\",\"page\":88,\"isNonProfit\":true,\"address\":{\"street\":\"科技園路.\",\"city\":\"江蘇蘇州\",\"country\":\"中國\"},\"links\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"}]}"; JSONObject jsonStr = JSONObject.parseObject(str); System.out.println("name:" + jsonStr.getString("name")); System.out.println("page:" + jsonStr.getIntValue("page")); System.out.println(); JSONArray links = jsonStr.getJSONArray("links"); JSONObject link = links.getJSONObject(0); System.out.println("name:" + link.getString("name") + "\t" + "url:" + link.getString("url")); System.out.println(); Test test = JSONObject.parseObject(str, Test.class); System.out.println("test.address.city:" + test.getAddress().getCity()); System.out.println("test.name:" + test.getName()); System.out.println(); List<LinksTest> linksTests = JSONObject.parseArray(links.toJSONString(), LinksTest.class); System.out.println("links.size:" + linksTests.size()); System.out.println("links[0].url:" + linksTests.get(0).getUrl()); System.out.println(); String testStr = JSONObject.toJSONString(test); System.out.println(testStr); System.out.println(); JSONObject addressJson = (JSONObject) JSONObject.toJSON(test.getAddress()); System.out.println("addressJson.city:" + addressJson.getString("city")); System.out.println(); JSONArray linksArray = (JSONArray) JSONObject.toJSON(test.getLinks()); System.out.println("links[0].name:" + linksArray.getJSONObject(0).getString("name")); System.out.println(); JSONObject jsonObject = new JSONObject(); jsonObject.put("name","name"); JSONObject address = new JSONObject(); address.put("city","city"); jsonObject.put("address",address); JSONArray linksA = new JSONArray(); JSONObject linkJ = new JSONObject(); linkJ.put("name","name2"); linksA.add(linkJ); jsonObject.put("links",linksA); System.out.println(jsonObject.toJSONString()); } @Data static class Test { private String name; private String url; private Integer page; private Boolean isNonProfit; private AddressTest address; private List<LinksTest> links; } @Data static class AddressTest { private String street; private String city; private String country; } @Data static class LinksTest { private String name; private String url; } }


dom4j

maven

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

測試資料

<?xml version="1.0" encoding="UTF-8" ?>
<test id="test">
    <name>name1</name>
    <url>http://www.baidu.com</url>
    <address id="address">
        <city>address_city</city>
    </address>
    <links name="links">
        <link id="link0">
            <name>link0_name</name>
            <url>link0_url</url>
        </link>
    </links>
</test>

code

package cn.qbz.thread;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Iterator;
import java.util.List;

public class Test112002 {
    public static void main(String[] args) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        Document read = saxReader.read(new File("E:\\workspace\\jiuerxueyuan\\test\\src\\main\\java\\cn\\qbz\\thread\\test.xml"));
        //獲取根節點
        Element rootElement = read.getRootElement();
        getNodes(rootElement);
    }

    private static void getNodes(Element rootElement) {
        System.out.println("當前節點名稱:" + rootElement.getName());
        //獲取屬性
        List<Attribute> attributes = rootElement.attributes();
        for (Attribute attribute : attributes) {
            System.out.println("屬性:" + attribute.getName() + "---" + attribute.getText());
        }
        //獲取當前節點的內容
        if (!"".equals(rootElement.getTextTrim())) {
            System.out.println(rootElement.getName() + "---" + rootElement.getText());
        }

        //遞迴獲取其子節點下的內容
        Iterator<Element> elementIterable = rootElement.elementIterator();
        while (elementIterable.hasNext()) {
            Element next = elementIterable.next();
            getNodes(next);
        }
    }
}


XML與JSON區別

Xml是重量級資料交換格式,佔寬頻比較大。
JSON是輕量級交換格式,xml佔寬頻小。
所有很多網際網路公司都會使用json作為資料交換格式
很多銀行專案,有些還是在使用xml。