JSON vs XML

JSON与XML比较

全面对比两种主流数据交换格式的优缺点和适用场景

JSON与XML概述

{}
JSON
JavaScript Object Notation

JSON是一种轻量级的数据交换格式,基于ECMAScript的一个子集,采用完全独立于语言的文本格式。

  • 起源:2001年,Douglas Crockford
  • 标准:ECMA-404, RFC 7159
  • MIME类型:application/json
  • 文件扩展名:.json
<>
XML
eXtensible Markup Language

XML是一种标记语言,用于存储和传输数据。它被设计为具有自我描述性,并且是SGML的一个简化子集。

  • 起源:1996年,W3C
  • 标准:W3C XML 1.0
  • MIME类型:application/xml, text/xml
  • 文件扩展名:.xml
历史背景
JSON

JSON最初由Douglas Crockford在2001年提出,它源于JavaScript语言的对象字面量语法。随着Ajax和Web 2.0的兴起,JSON因其轻量级和易于解析的特性而迅速流行。

2013年,JSON成为ECMA国际标准(ECMA-404),2014年成为RFC 7159互联网标准。

XML

XML于1996年由万维网联盟(W3C)创建,旨在简化SGML(标准通用标记语言)的复杂性,同时保持其强大功能。XML最初设计用于Web文档,但很快被广泛用于数据交换。

XML 1.0于1998年成为W3C推荐标准,至今已有多个版本。

语法比较

相同数据结构的不同表示
用户信息表示
JSON
{
  "user": {
    "id": 12345,
    "name": "张三",
    "age": 30,
    "email": "zhangsan@example.com",
    "active": true,
    "hobbies": ["阅读", "游泳", "编程"],
    "address": {
      "street": "人民路123号",
      "city": "北京",
      "country": "中国"
    }
  }
}
XML
<user>
  <id>12345</id>
  <name>张三</name>
  <age>30</age>
  <email>zhangsan@example.com</email>
  <active>true</active>
  <hobbies>
    <hobby>阅读</hobby>
    <hobby>游泳</hobby>
    <hobby>编程</hobby>
  </hobbies>
  <address>
    <street>人民路123号</street>
    <city>北京</city>
    <country>中国</country>
  </address>
</user>
语法元素对比
语法元素 JSON XML 说明
根元素 对象或数组 单个根元素 XML必须有一个且仅有一个根元素
数据表示 键值对 元素和属性 JSON使用键值对,XML使用元素和属性表示数据
数组/列表 原生支持数组 重复元素表示列表 JSON有原生数组类型,XML通过重复元素表示列表
数据类型 字符串、数字、布尔值、null、对象、数组 所有数据都是字符串 JSON有数据类型概念,XML所有数据都是文本
注释 不支持 支持 JSON标准不支持注释,XML支持注释
命名空间 不支持 支持 XML支持命名空间,避免元素名冲突
模式定义 JSON Schema XML Schema, DTD 两者都支持模式定义,但语法不同

特性对比

JSON与XML特性详细对比
特性 JSON XML 说明
可读性 中等 JSON结构更简洁,XML标签较多
文件大小 较小 较大 JSON语法更简洁,相同数据量文件更小
解析速度 JSON解析通常比XML快
数据类型支持 丰富 有限 JSON支持多种数据类型,XML所有数据都是文本
扩展性 中等 XML通过命名空间和模式定义具有更好的扩展性
工具支持 丰富 非常丰富 两者都有丰富的工具支持,XML因历史更久工具更多
安全性 较高 需注意安全 XML有XXE等安全风险,JSON相对更安全
浏览器支持 原生支持 需要解析器 现代浏览器原生支持JSON,XML需要DOM解析器
标准化程度 非常高 两者都是标准格式,XML标准化程度更高
JSON优势
  • 语法简洁,易于读写
  • 解析速度快,占用资源少
  • 与JavaScript天然集成
  • 数据结构与编程语言对象更接近
  • 更适合Web API和移动应用
XML优势
  • 强大的文档描述能力
  • 丰富的模式定义和验证机制
  • 命名空间支持,避免元素冲突
  • 成熟的工具链和生态系统
  • 更适合文档型数据和复杂数据结构

应用场景

JSON适用场景
Web API

RESTful API数据交换

移动应用

移动端数据存储和传输

NoSQL数据库

文档型数据库数据存储

XML适用场景
文档存储

Office文档、配置文件

企业应用

SOAP Web服务、企业集成

配置文档

复杂配置文件、元数据

性能分析

JSON与XML性能对比
解析性能

JSON通常比XML解析更快,原因包括:

  • JSON数据结构更简单
  • JSON不需要复杂的解析器
  • 现代浏览器原生支持JSON
  • JSON文件通常更小
数据大小对比

相同数据内容,JSON通常比XML文件小30%-50%

// JSON: 约120字符
{"user":{"id":123,"name":"张三"}}
// XML: 约180字符
<user><id>123</id><name>张三</name></user>
内存使用

JSON在内存中的表示通常比XML更紧凑,因为:

  • JSON对象直接映射到编程语言对象
  • XML需要维护DOM树结构
  • XML元素有更多元数据(命名空间、属性等)
性能测试结果

根据多项性能测试,JSON的解析速度通常比XML快2-10倍,具体取决于数据复杂度和使用的解析器。

转换示例

JSON与XML相互转换
在线转换演示
JSON输入
XML输出
JavaScript转换代码
JSON转XML
function jsonToXml(jsonObj, rootName = 'root') {
  let xml = `<${rootName}>`;

  for (let key in jsonObj) {
    if (jsonObj.hasOwnProperty(key)) {
      const value = jsonObj[key];
      if (Array.isArray(value)) {
        value.forEach(item => {
          xml += `<${key}>${jsonToXml(item, '')}</${key}>`;
        });
      } else if (typeof value === 'object' && value !== null) {
        xml += `<${key}>${jsonToXml(value, '')}</${key}>`;
      } else {
        xml += `<${key}>${value}</${key}>`;
      }
    }
  }

  xml += `</${rootName}>`;
  return xml;
}
XML转JSON
function xmlToJson(xmlString) {
  const parser = new DOMParser();
  const xmlDoc = parser.parseFromString(xmlString, "text/xml");

  function parseNode(node) {
    const obj = {};

    // 处理元素节点
    if (node.nodeType === 1) {
      if (node.attributes.length > 0) {
        obj["@attributes"] = {};
        for (let attr of node.attributes) {
          obj["@attributes"][attr.nodeName] = attr.nodeValue;
        }
      }
    }

    // 处理子节点
    if (node.hasChildNodes()) {
      for (let child of node.childNodes) {
        if (child.nodeType === 1) {
          const nodeName = child.nodeName;
          if (typeof obj[nodeName] === "undefined") {
            obj[nodeName] = parseNode(child);
          } else {
            if (!Array.isArray(obj[nodeName])) {
              obj[nodeName] = [obj[nodeName]];
            }
            obj[nodeName].push(parseNode(child));
          }
        } else if (child.nodeType === 3 && child.nodeValue.trim() !== "") {
          obj["#text"] = child.nodeValue.trim();
        }
      }
    }

    return Object.keys(obj).length === 0 ? "" : obj;
  }

  return parseNode(xmlDoc.documentElement);
}

总结

如何选择JSON或XML
选择JSON的情况
  • Web API和移动应用开发
  • 需要快速解析和高性能
  • 数据量较小且结构简单
  • 与JavaScript前端紧密集成
  • 不需要复杂的文档验证
  • 团队熟悉JavaScript技术栈
选择XML的情况
  • 企业级应用和SOAP服务
  • 需要严格的文档验证
  • 复杂的数据结构和关系
  • 需要命名空间支持
  • 文档型数据和配置文件
  • 与遗留系统集成
最终建议

对于大多数现代Web应用和API,JSON是更好的选择,因为它更轻量、解析更快且与JavaScript无缝集成。对于需要严格验证、复杂数据结构或与现有XML系统集成的场景,XML仍然是合适的选择。

在实际项目中,考虑团队技能、系统要求和性能需求,选择最适合的数据格式。