天天看点

走进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