天天看點

走進Java接口測試之了解JSON和XML基礎

現如今 restful api 越來越流行,而 json 和 xml 基本上是兩種主流格式用來交換資料,json和 xml 都在 web上有完善的開放标準(rfc 7159,rfc 4825),本文将帶着大家來了解下這個兩種資料格式。

走進Java接口測試之了解JSON和XML基礎

json 是一種用于在多個應用程式之間共享資料的通信格式。json代表 javascript object notation。它基本上是鍵值對的集合。

官網:http://www.json.org/

線上校驗json結構的網站:https://jsonformatter.curiousconcept.com/

json 有兩種資料結構:

map,也稱為對象;{....}

array;[......]

也就是說所有的 json 對象都是要以這些形式表示;

簡單的說就是 java 中的 map,名稱-值對的形式給出,名稱和值之間用 “:” 隔開,兩個map之間用“,”隔開,一般表示形式如下:

<code>{'key1':'value1','key2':'value2'}</code>

下面的 object 有 3 個鍵值對

<code>{ "firstname" : "vijay", "lastname" : "gupta", "gender" : "male" }</code>

map 是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括号)開始,“}”(右括号)結束。每個“名稱”後跟一個“:”(冒号);“‘名稱/值’ 對”之間使用“,”(逗号)分隔。

走進Java接口測試之了解JSON和XML基礎

就是普通意義上的數組,一般形式如下:

<code>['arr1','arr2','arr3'];</code>

下面的數組有 3 個json 對象,每個對象有 3 個鍵值對

<code>[</code>

<code>{"name" : "potato","stock" : "10", "unit" : "kg"},</code>

<code>{"name" : "tomato","stock" : "32", "unit" : "kg"},</code>

<code>{"name" : "onion","stock" : "27", "unit" : "kg"}</code>

<code>]</code>

數組是值(value)的有序集合。一個數組以“[”(左中括号)開始,“]”(右中括号)結束。值之間使用“,”(逗号)分隔。

走進Java接口測試之了解JSON和XML基礎

圖中的值(value)可以是雙引号括起來的字元串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。

走進Java接口測試之了解JSON和XML基礎

字元串(string)是由雙引号包圍的任意數量 unicode 字元的集合,使用反斜線轉義。一個字元(character)即一個單獨的字元串(character string)。

字元串(string)與c或者java的字元串非常相似。

走進Java接口測試之了解JSON和XML基礎

數值(number)也與c或者java的數值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節。

走進Java接口測試之了解JSON和XML基礎

json對象也可以嵌套:

<code>{</code>

<code>"id": "0001", "type": "donut", "name": "cake",</code>

<code>"image":</code>

<code>{ "url": "images/0001.jpg", "width": 200, "height": 200},</code>

<code>"thumbnail":</code>

<code>{"url": "images/thumbnails/0001.jpg", "width": 32, "height": 32}</code>

<code>}</code>

json 的資料結構隻有兩種

可以嵌套表示,比如 array 中可以嵌套 object 等

object 是以{}表示,array是以 [ ] 表示

xml 是一種标記語言,也是一種用于在多個應用程式之間共享資料的通信格式,而不是 html,它更側重于資料表示。

走進Java接口測試之了解JSON和XML基礎

xml 被設計用來描述資料并關注資料是什麼

走進Java接口測試之了解JSON和XML基礎

xml 标簽不需要預先定義。在 xml 中,标簽和文檔結構由其作者定義。通常,xml标簽是自解釋的,并描述它們之間的内容。

走進Java接口測試之了解JSON和XML基礎

例如:

<code>&lt;section&gt;</code>

<code>   &lt;title&gt;book&lt;/title&gt;</code>

<code>   &lt;signing&gt;</code>

<code>       &lt;author name="author-1"/&gt;</code>

<code>       &lt;book title="book1" price="$11"/&gt;</code>

<code>   &lt;/signing&gt;</code>

<code>       &lt;author name="author-2"/&gt;</code>

<code>       &lt;book title="book2" price="$22"/&gt;</code>

<code>&lt;/section&gt;</code>

必須包含一個根元素,它是所有其他元素的父元素

所有 xml 元素都必須具有結束标記

xml 标簽區分大小寫

xml 元素必須正确嵌套

必須引用 xml 屬性值

線上校驗xml結構的網站:https://codebeautify.org/xmlvalidator

某些字元不能用作 xml 标記内的内容。是以,我們用特定文本(稱為實體引用)替換這些字元,以便從字面上解析這些字元

在 xml 中有 5 個預定義的實體引用:

走進Java接口測試之了解JSON和XML基礎

線上格式互轉: http://www.utilities-online.info/xmltojson/#.xfe-pegzauk

xml格式:

<code>&lt;person&gt;</code>

<code>   &lt;name&gt;zuozewei&lt;/name&gt;</code>

<code>   &lt;age&gt;20&lt;/age&gt;</code>

<code>&lt;/person&gt;</code>

json格式:

<code>   "name":"zuozewei",</code>

<code>   "age":20</code>

<code> "section": {</code>

<code>   "title": "book",</code>

<code>   "signing": [</code>

<code>     {</code>

<code>       "author": { "-name": "author-1" },</code>

<code>       "book": {</code>

<code>         "-title": "book1",</code>

<code>         "-price": "$11"</code>

<code>       }</code>

<code>     },</code>

<code>       "author": { "-name": "author-2" },</code>

<code>         "-title": "book2",</code>

<code>         "-price": "$22"</code>

<code>     }</code>

<code>   ]</code>

<code> }</code>

對比項

xml

json

起源

1998年

2006年

祖先

sgml

javascript

備援

更多

更少

尺寸

更大

更小

序列化和反序列化速度

稍慢

數組

沒有

命名空間支援

檔案格式

.xml

.json

浏覽器渲染

定位

面向文檔

面向資料

混合内容支援

中繼資料支援

xml是一種資料格式,同時它也是一種語言。它具有許多強大的功能,使其不僅僅是簡單的資料交換資料格式。例如 xpath,屬性和命名空間,xml 模式和 xslt 等。所有這些功能都是 xml 流行的主要原因。

json 并不是為了擁有這樣的功能而設計的,即使它們中的一些現在正試圖在 json 中找到它們的位置,例如 jsonpath。

簡而言之,xml 的目的是文檔标記。每當文檔标記和中繼資料是資料的重要組成部分并且不能被删除時,總是更喜歡使用 xml。

json 的目的是結構化資料交換。它通過直接表示對象,數組,數字,字元串和布爾值來實作此目的。如果不要求中繼資料和文檔标記,将始終使用 json。

參考資料:

[1] https://www.json.org/json-zh.html 

[2] https://blog.csdn.net/xiazdong/article/details/7059573