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仍然是合适的选择。

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