引言

现如今 Restful API 越来越流行,而 JSON 和 XML 基本上是两种主流格式用来交换数据,JSON和 XML 都在 Web上有完善的开放标准(RFC 7159,RFC 4825),本文将带着大家来了解下这个两种数据格式。

走进Java接口测试之理解JSON和XML基础_XML基础

JSON

JSON 简介

JSON 是一种用于在多个应用程序之间共享数据的通信格式。JSON代表 JavaScript Object Notation。它基本上是键值对的集合。

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

在线校验JSON结构的网站:https://jsonformatter.curiousconcept.com/

JSON 数据结构

JSON 有两种数据结构:

  • Map,也称为对象;{….}

  • Array;[……]

也就是说所有的 JSON 对象都是要以这些形式表示;

Map

简单的说就是 Java 中的 Map,名称-值对的形式给出,名称和值之间用 “:” 隔开,两个Map之间用“,”隔开,一般表示形式如下:

  1. {'key1':'value1','key2':'value2'}

下面的 Object 有 3 个键值对

  1. { "firstName" : "Vijay", "lastName" : "Gupta", "gender" : "Male" }

Map 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

走进Java接口测试之理解JSON和XML基础_JSON_02

Array

就是普通意义上的数组,一般形式如下:

  1. ['arr1','arr2','arr3'];

下面的数组有 3 个JSON 对象,每个对象有 3 个键值对

  1. [

  2. {"name" : "Potato","stock" : "10", "unit" : "kg"},

  3. {"name" : "Tomato","stock" : "32", "unit" : "kg"},

  4. {"name" : "Onion","stock" : "27", "unit" : "kg"}

  5. ]

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

走进Java接口测试之理解JSON和XML基础_XML基础_03

图中的值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

走进Java接口测试之理解JSON和XML基础_XML基础_04

字符串(string)是由双引号包围的任意数量 Unicode 字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。

走进Java接口测试之理解JSON和XML基础_JSON_05

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

走进Java接口测试之理解JSON和XML基础_XML基础_06

嵌套Map

JSON对象也可以嵌套:

  1. {

  2. "id": "0001", "type": "donut", "name": "Cake",

  3. "image":

  4. { "url": "images/0001.jpg", "width": 200, "height": 200},

  5. "thumbnail":

  6. {"url": "images/thumbnails/0001.jpg", "width": 32, "height": 32}

  7. }

小结

  • JSON 的数据结构只有两种

  • 可以嵌套表示,比如 Array 中可以嵌套 Object 等

  • Object 是以{}表示,Array是以 [ ] 表示

XML

XML简介

XML 是一种标记语言,也是一种用于在多个应用程序之间共享数据的通信格式,而不是 HTML,它更侧重于数据表示。

走进Java接口测试之理解JSON和XML基础_XML基础_07

XML 被设计用来描述数据并关注数据是什么

走进Java接口测试之理解JSON和XML基础_JSON_08

XML 标签不需要预先定义。在 XML 中,标签和文档结构由其作者定义。通常,XML标签是自解释的,并描述它们之间的内容。

走进Java接口测试之理解JSON和XML基础_XML基础_09

例如:

  1. <section>

  2.    <title>BOOK</title>

  3.    <signing>

  4.        <author name="author-1"/>

  5.        <book title="book1" price="$11"/>

  6.    </signing>

  7.    <signing>

  8.        <author name="author-2"/>

  9.        <book title="book2" price="$22"/>

  10.    </signing>

  11. </section>

XML语法规则

  • 必须包含一个根元素,它是所有其他元素的父元素

  • 所有 XML 元素都必须具有结束标记

  • XML 标签区分大小写

  • XML 元素必须正确嵌套

  • 必须引用 XML 属性值

在线校验XML结构的网站:https://codebeautify.org/xmlvalidator

XML中的实体引用

某些字符不能用作 XML 标记内的内容。因此,我们用特定文本(称为实体引用)替换这些字符,以便从字面上解析这些字符

在 XML 中有 5 个预定义的实体引用:

走进Java接口测试之理解JSON和XML基础_XML基础_10

JSON与XML互转示例

在线格式互转: http://www.utilities-online.info/xmltojson/#.XFE-pegzaUk

简单XML

XML格式:

  1. <person>

  2.    <name>zuozewei</name>

  3.    <age>20</age>

  4. </person>

JSON格式:

  1. {

  2.    "name":"zuozewei",

  3.    "age":20

  4. }

复杂XML

XML格式:

  1. <section>

  2.    <title>BOOK</title>

  3.    <signing>

  4.        <author name="author-1"/>

  5.        <book title="book1" price="$11"/>

  6.    </signing>

  7.    <signing>

  8.        <author name="author-2"/>

  9.        <book title="book2" price="$22"/>

  10.    </signing>

  11. </section>

JSON格式:

  1. {

  2.  "section": {

  3.    "title": "BOOK",

  4.    "signing": [

  5.      {

  6.        "author": { "-name": "author-1" },

  7.        "book": {

  8.          "-title": "book1",

  9.          "-price": "$11"

  10.        }

  11.      },

  12.      {

  13.        "author": { "-name": "author-2" },

  14.        "book": {

  15.          "-title": "book2",

  16.          "-price": "$22"

  17.        }

  18.      }

  19.    ]

  20.  }

  21. }

XML VS JSON

对比项 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