澳门新浦京手机版SAY SAY JSON

本文由码农网 –
小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

大家好,我是IT修真院上海分院第一期的学员唐坤,一枚正直纯洁善良的java程序员

JSON 基础

不管有多少服务器端语言出现,没有谁能够取代PHP。至少是不久的将来都不可能。
PHP还有许多最著名的web应用程序的支柱。

今天给大家分享一下,SAY SAY JSON?

简 单地说,JSON 可以将 JavaScript
对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从
Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是
JavaScript 很容易解释它,而且 JSON
可以表示比名称/值对更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

如果你是一个后端开发人员,并且PHP是你技术堆栈的一部分,那么你会发现本教程非常有用。在这篇文章中,我将讲解如何一步一步使用PHP,FusionCharts的核心JavaScript图表库,以及它的PHP图表包装程序创建漂亮的图表。

背景介绍:

简单 JSON 示例

下面就是我们今天要完成的目标图表

什么是JSON

按照最简单的形式,可以用下面这样的 JSON 表示名称/值对:

澳门新浦京手机版 1

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript
Programming Language, Standard ECMA-262 3rd Edition – December
1999的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,
C++, C#, Java, JavaScript, Perl, Python等)。
这些特性使JSON成为理想的数据交换语言。

{ "firstName": "Brett" }

有四个步骤:

1.背景介绍

这个示例非常基本,而且实际上比等效的纯文本名称/值对占用更多的空间:

  • 步骤0:准备数据
  • 步骤1:引用JS和PHP文件
  • 步骤2:创建图表对象
  • 步骤3:渲染图表

什么是JSON

firstName=Brett

步骤0:准备数据

由于需要在计划对数据可视化之前,先准备好数据,所以我叫这一步为步骤0,而非步骤-1。

FusionCharts既理解XML,也理解JSON数据格式,不过在本教程中,我们只用JSON。我们将通过转换以下数据为FusionCharts认可的JSON键值来启动我们的教程。

月份 收入
Oct 490000
Nov 900000
Dec 730000

下面是上述数据的JSON表示:

[
    {"label": "Oct", "value": "490000"},
    {"label": "Nov", "value": "900000"},
    {"label": "Dec", "value": "730000"}
]

我们将使用上述数据绘制条形图,并格式化我们的行为。对于其他图表类型,可能会有点复杂。

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript
Programming Language, Standard ECMA-262 3rd Edition – December
1999的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,
C++, C#, Java, JavaScript, Perl, Python等)。
这些特性使JSON成为理想的数据交换语言。

但是,当将多个名称/值对串在一起时,JSON
就会体现出它的价值了。首先,可以创建包含多个名称/值对的记录,比如:

步骤1:引用依赖性

在这一步中,我们将包括FusionCharts的核心JavaScript库和PHP图表包装程序。

具体是这样做到的:

<? php
// including FusionCharts PHP wrapper
    include(path/to/fusioncharts.php);
?>

<head>
    <!-- FusionCharts core package files -->
    <script type="text/javascript" src="path/to/fusioncharts.js"></script>
</head>

JSON建构于两种结构:

{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }

步骤2:创建图表对象

这一步我们要使用FusionCharts的PHP包装程序类为我们的图表 $coolChart 创建一个对象。创建图表对象的语法如下:

$objectName = new FusionCharts("chart type",
              "unique chart ID",
              "Chart Width",
              "Chart Height",
              "HTML Element for Chart",
              "Chart Data Format",
              "Data Source");

下面的图表对象用于我们要在本教程中创建的图表:

$coolChart = new FusionCharts("bar2d", "myCoolPHPChart", "100%", "600",
               "barchart-container", "json",
               '{
                "chart": {
                    "caption": "Monthly revenue for Q4 - 2015",
                    "xAxisName": "Month",
                    //Other Chart Options
                },
                "data": [{
                    "label": "Oct",
                    "value": "490000"
                } //More Chart Data
            }');

上述语法中提到的“Data Source”包含两个对象:

图表对象:包括负责图表交互性和装饰的各种属性。它们中的一些说明如下:

  • showHoverEffect:(布尔型),用于启用或禁用图表中的悬停效果。
  • plotFillHoverColor:(十六进制代码/颜色名称)用来定义鼠标悬停的曲线颜色。
  • plotFillHoverAlpha:(整型)用于定义悬停颜色的透明度。
  • baseFont:(字符串)用于定义图表的字体类型。
  • baseFontSize:(整型)用于设置图表的字体大小。
  • baseFontColor:(十六进制代码/颜色名称)用于设置图表的字体颜色。

数据对象:包括用于每个数据图的标签和它们相应的值。可以被添加到数据对象内的其它属性是:

  • displayValue:(字符串)允许你为特殊的数据图设置自定义的字符串值。
  • link:(字符串)允许你通过数据图链接到网页,drill-down图表或自定义的JavaScript函数来获取更进一步的图表功能。
  • showLabel:(布尔型)用于启用或禁用特定数据图(栏)的标签显示。

有很多可用的自定义选项可以根据你的具体使用情况使用。你可以查看这个庞大的图表属性列表来进行进一步探索。

“名称/值”对的集合(A collection of name/value
pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash
table),有键列表(keyed list),或者关联数组 (associative array)。

从语法方面来看,这与名称/值对相比并没有很大的优势,但是在这种情况下 JSON
更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。

步骤3:渲染图表

在渲染图表时,我们要定义HTML<div>元素。下面是做法:

<body>
    <div id="barchart-container">Cool Chart on its way!</div>
</body>

要渲染图表,我们将调用render方法用于上面步骤中创建的图表对象。

$coolChart->render();

如果你正确地按照我上面提到的步骤去做,那么现在你应该已经创建好了一个图表。如果你在你的代码中发现任何错误,也可以参阅GitHub代码仓库以获得这个项目的全部源代码。

值的有序列表(An ordered list of
values)。在大部分语言中,它被理解为数组(array)。

值的数组

更多资源

在本教程中,我们在图表对象内直接传递JSON用于图表,但也有其他加载数据的方法。可以参考这个文档页面来了解其他加载数据的方法。

PHP和MySQL被认为是用于服务器端语言和数据库的最好结合之一,目前被许多流行的web应用程序使用。要了解更多有关于它们的用法,可以查看这篇有关如何使用PHP和来自于MySQL数据库数据创建drill-down图表的教程。

PS:欢迎提出有关于本教程的任何问题!

2.知识剖析

当 需要表示一组值时,JSON
不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在
XML
中,需要许多开始标记和结束标记;如果使用典型的名称/值对(就像在本系列前面文章中看到的那种名称/值对),那么必须建立一种专有的数据格式,或者将键
名称修改为 person1-firstName 这样的形式。

JSON建构于两种结构:

如果使用 JSON,就只需将多个带花括号的记录分组在一起:

“名称/值”对的集合(A collection of name/value
pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash
table),有键列表(keyed list),或者关联数组 (associative array)。

{ "people": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }]}

值的有序列表(An ordered list of
values)。在大部分语言中,它被理解为数组(array)。

这不难理解。在这个示例中,只有一个名为 people
的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值:

2.知识剖析

{ "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" } ],"authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ],"musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ]}

JSON究竟是什么东西?为什么JSON就是易于数据交换?

这里最值得注意的是,能够表示多个值,每
个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors
和 musicians)之间,记录中实际的名称/值对可以不一样。JSON
是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。

一种数据格式

在处理 JSON
格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以以不同方式表示同一事物。

什么是格式?就是规范你的数据要怎么表示,举个栗子,有个人叫“二百六”,身高“160cm”,体重“60kg”,现在你要将这个人的这些信息传给别人或者别的什么东西,你有很多种选择:

在 JavaScript 中使用 JSON

姓名“二百六”,身高“160cm”,体重“60kg”

掌握了 JSON 格式之后,在 JavaScript 中使用它就很简单了。JSON 是
JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON
数据不需要任何特殊的 API 或工具包。

name=”二百六”&height=”160cm”&weight=”60kg”

将 JSON 数据赋值给变量

{“name”:”二百六”,”height”:160,”weight”:60}

例如,可以创建一个新的 JavaScript 变量,然后将 JSON
格式的数据字符串直接赋值给它:

… …
以上所有选择,传递的数据是一样的,但是你可以看到形式是可以各式各样的,这就是各种不同格式化后的数据,JSON是其中一种表示方式。

var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] }

JSON究竟是什么东西?为什么JSON就是易于数据交换?

这非常简单;现在 people 包含前面看到的 JSON
格式的数据。但是,这还不够,因为访问数据的方式似乎还不明显。

一种数据格式

访问数据

什么是格式?就是规范你的数据要怎么表示,举个栗子,有个人叫“二百六”,身高“160cm”,体重“60kg”,现在你要将这个人的这些信息传给别人或者别的什么东西,你有很多种选择:

尽 管看起来不明显,但是上面的长字符串实际上只是一个数组;将这个数组放进
JavaScript
变量之后,就可以很轻松地访问它。实际上,只需用点号表示法来表示数组元素。所以,要想访问
programmers 列表的第一个条目的姓氏,只需在 JavaScript
中使用下面这样的代码:

姓名“二百六”,身高“160cm”,体重“60kg”

people.programmers[0].lastName;

name=”二百六”&height=”160cm”&weight=”60kg”

注意,数组索引是从零开始的。所以,这行代码首先访问 people
变量中的数据;然后移动到称为 programmers
的条目,再移动到第一个记录;最后,访问 lastName 键的值。结果是字符串值
“McLaughlin”。

{“name”:”二百六”,”height”:160,”weight”:60}

下面是使用同一变量的几个示例。

… …
以上所有选择,传递的数据是一样的,但是你可以看到形式是可以各式各样的,这就是各种不同格式化后的数据,JSON是其中一种表示方式。

people.authors[1].genre // Value is "fantasy"people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't onepeople.programmers.[2].firstName // Value is "Elliotte"

基于文本的数据格式

利用这样的语法,可以处理任何 JSON 格式的数据,而不需要使用任何额外的
JavaScript 工具包或 API。

JSON是基于文本的数据格式,相对于基于二进制的数据,所以JSON在传递的时候是传递符合JSON这种格式(至于JSON的格式是什么我们第二部分再说)的字符串,我们常会称为“JSON字符串”。

修改 JSON 数据

轻量级的数据格式

正如可以用点号和括号访问数据,也可以按照同样的方式轻松地修改数据:

在JSON之前,有一个数据格式叫xml,现在还是广泛在用,但是JSON更加轻量,如xml需要用到很多标签,像上面的例子中,你可以明显看到xml格式的数据中标签本身占据了很多空间,而JSON比较轻量,即相同数据,以JSON的格式占据的带宽更小,这在有大量数据请求和传递的情况下是有明显优势的

people.musicians[1].lastName = "Rachmaninov";

基于文本的数据格式

在将字符串转换为 JavaScript 对象之后,就可以像这样修改变量中的数据。

JSON是基于文本的数据格式,相对于基于二进制的数据,所以JSON在传递的时候是传递符合JSON这种格式(至于JSON的格式是什么我们第二部分再说)的字符串,我们常会称为“JSON字符串”。

转换回字符串

轻量级的数据格式

当然,如果不能轻松地将对象转换回本文提到的文本格式,那么所有数据修改都没有太大的价值。在
JavaScript 中这种转换也很简单:

在JSON之前,有一个数据格式叫xml,现在还是广泛在用,但是JSON更加轻量,如xml需要用到很多标签,像上面的例子中,你可以明显看到xml格式的数据中标签本身占据了很多空间,而JSON比较轻量,即相同数据,以JSON的格式占据的带宽更小,这在有大量数据请求和传递的情况下是有明显优势的。

String newJSONtext = people.toJSONString();

被广泛地用于数据交换

这样就行了!现在就获得了一个可以在任何地方使用的文本字符串,例如,可以将它用作
Ajax 应用程序中的请求字符串。

轻量已经是一个用于数据交换的优势了,但更重要的JSON是易于阅读、编写和机器解析的,即这个JSON对人和机器都是友好的,而且又轻,独立于语言(因为是基于文本的),所以JSON被广泛用于数据交换。

更重要的是,可以将任何 JavaScript 对象转换为 JSON
文本。并非只能处理原来用 JSON 字符串赋值的变量。为了对名为 myObject
的对象进行转换,只需执行相同形式的命令:

以前端JS进行ajax的POST请求为例,后端PHP处理请求为例:

String myObjectInJSON = myObject.toJSONString();

前端构造一个JS对象,用于包装要传递的数据,然后将JS对象转化为JSON字符串,再发送请求到后端;

这就是 JSON 与本系列讨论的其他数据格式之间最大的差异。如果使用
JSON,只需调用一个简单的函数,就可以获得经过格式化的数据,可以直接使用了。对于其他数据格式,需要在原始数据和格式化数据之间进行转换。即使使用
Document Object Model 这样的 API,也需要学习这个 API 并使用 API
的对象,而不是使用原生的 JavaScript 对象和语法。

后端PHP接收到这个JSON字符串,将JSON字符串转化为PHP对象,然后处理请求。

最终结论是,如果要处理大量 JavaScript 对象,那么 JSON
几乎肯定是一个好选择,这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。

可以看到,相同的数据在这里有3种不同的表现形式,分别是前端的JS对象、传输的JSON字符串、后端的PHP对象,JS对象和PHP对象明显不是一个东西,但是由于大家用的都是JSON来传递数据,大家都能理解这种数据格式,都能把JSON这种数据格式很容易地转化为自己能理解的数据结构,这就方便啦,在其他各种语言环境中交换数据都是如此。

JSON在PHP中的应用

被广泛地用于数据交换

互联网的今天,AJAX已经不是什么陌生的词汇了。说起AJAX,可能会立即想起因RSS而兴起的XML。XML的解析,恐怕已经不是什么难题了,特别是
PHP5,大量的XML解析器的涌现,如最轻量级的SimpleXML。不过对于AJAX来说,XML的解析更倾向于前台Javascript的支持度。
我想所有解析过XML的人,都会因树和节点而头大。不可否认,XML是很不错的数据存储方式,但是其灵活恰恰造成了其解析的困难。当然,这里所指的困难,
是相对于本文的主角--JSON而言。
JSON为何物?我就不重复概念了。通俗的说,它是一种数据的存储格式,就像PHP序列化后的字符串一样。它是一种数据描述。比如我们将一
个数组序列化后存放,就可以很容易的反序列化后应用。JSON也是如此,只不过他搭建的是客户端Javascript和服务端PHP的交互桥梁。我们用
PHP生成JSON后的字符串,然后把这个字符串传给前台Javascript,Javascirpt就可以很容易的将其反JSON然后应用。说通俗点,
它真的很像数组。
言归正传,如何使用JSON。PHP5.2开始内置了JSON的支持。当然,如果低于这个版本的话,那么市面上有很多PHP版本的实现,随
便下一个用就OK啦。现在主要是说说PHP内置支持的JSON。很简单,两个函数:json_encode和json_decode。
一个编码,一个解码。先看看编码的使用:

轻量已经是一个用于数据交换的优势了,但更重要的JSON是易于阅读、编写和机器解析的,即这个JSON对人和机器都是友好的,而且又轻,独立于语言(因为是基于文本的),所以JSON被广泛用于数据交换。

‘陈毅鑫’, ‘nick’ => ‘深空’, ‘contact’ => array( ’email’ =>
‘shenkong at qq dot com’, ‘website’ => ”, )
); $json_string = json_encode; echo $json_string; ?>
很简单的将一个数组JSON了。需要指出的是,在非UTF-8编码下,中文字符将不可被encode,结果会出来空值,所以,如果你使用
gb2312编写PHP代码,那么就需要将包含中文的内容使用iconv或者mb转为UTF-8再进行json_encode,上面输出结果如下:
{“name”:”u9648u6bc5u946b”,”nick”:”u6df1u7a7a”,”contact”:{“email”:”shenkong
at qq dot com”,”website”:”http://www.chenyixin.com”}}
我都说了和序列化很像,你还不信。编码后就要解码,PHP提供了相应的函数json_decode,json_decode执行后,将会得到一个对象,操作如下:

以前端JS进行ajax的POST请求为例,后端PHP处理请求为例:

‘陈毅鑫’, ‘nick’ => ‘深空’, ‘contact’ => array( ’email’ =>
‘shenkong at qq dot com’, ‘website’ => ”, )
); $json_string = json_encode; $obj = json_decode; print_r; ?>
访问对象内的属性会吧?$obj->name,这样子的,当然,也可以把它转位数组,方便调用啦:
$json_string = json_encode; $obj = json_decode; $arr = $obj;
print_r;
PHP转来转去的用途不是特别大,除了缓存生成,感觉还不如直接存数组呢,不过,当你和前台交互的时候,它的作用就出来咯,下面看看我怎么用Javascript来使用这段字符:

前端构造一个JS对象,用于包装要传递的数据,然后将JS对象转化为JSON字符串,再发送请求到后端;

上面中,直接将这个字符串赋给一个变量,它就变成一个Javascript数组了(专业化术语应该不叫数组,不过由于PHP的习惯问题,我就
一直叫数组好了,方便理解)。这样,可以很方便的对arr进行遍历或者任意做你想做的事情了。写到这里,好像都没提到AJAX哦?是哦,联想一下,如果服
务端返回的responseText用JSON过的字符串代替XML的话,前台Javascript处理起来是不是很方便呢?狗皮膏药就是这样用的。
其实写到这里,除了数据的存储格式不太一样外,JSON和XML也没什么太大区别哦,不过下面我说的一点。虽然和XML没多大关系,不过,
可以说明JSON更大范围的应用,那就是,跨域的数据调用。由于安全性问题,AJAX不支持跨域调用,这样要调用不同域名下的数据,很麻烦哦,虽然有解决
方案(stone在他的讲座上提到过了代理啊什么的虽然听不懂但是知道能解决)。我写两个文件,足以展示跨域调用了。
主调文件index.html

后端PHP接收到这个JSON字符串,将JSON字符串转化为PHP对象,然后处理请求。

被调文件profile.php

可以看到,相同的数据在这里有3种不同的表现形式,分别是前端的JS对象、传输的JSON字符串、后端的PHP对象,JS对象和PHP对象明显不是一个东西,但是由于大家用的都是JSON来传递数据,大家都能理解这种数据格式,都能把JSON这种数据格式很容易地转化为自己能理解的数据结构,这就方便啦,在其他各种语言环境中交换数据都是如此。

‘陈毅鑫’, ‘nick’ => ‘深空’, ‘contact’ => array( ’email’ =>
‘shenkong at qq dot com’, ‘website’ => ”, )
); $json_string = json_encode; echo “getProfile”; ?>
很显然,当index.html调用profile.php时,JSON字符串生成,并作为参数传入getProfile,然后将昵称插入到div中,这样一次跨域数据交互就完成了,是不是特别简单。既然JSON这么简单易用而且好用,还等什么呢?^_^服务器端的
JSON

JSON数据类型

将 JSON 发给服务器

Number 数字型 String 字符串型 Boolean 布尔型 Array 数组 Object 对象 null
空值

将 JSON
发给服务器并不难,但却至关重要,而且还有一些重要的选择要做。但是,一旦决定使用
JSON,所要做的这些选择就会十分简单而且数量有限,所以您需要考虑和关注的事情不多。重要的是能够将
JSON 字符串发送给服务器,而且最好能做到尽快和尽可能简单。

(1)json中不区分整数、小数等类型,而统一使用Number来存储数字。

通过 GET 以名称/值对发送 JSON

(2)Array表示数组,以中括号”[]”括起来,元素之间以逗号分隔,元素可以为任意类型。

将 JSON
数据发给服务器的最简单方法是将其转换成文本,然后以名称/值对的值的方式进行发送。请务必注意,JSON
格式的数据是相当长的一个对象,看起来可能会如清单 1 所示:

(3)Object表示对象,类似于C语言中的结构体,以花括号”{}”括起来,其元素要求为键值对,key必须为String类型的,而value则可为任意类型。key和value之间以”:”表示映射关系,元素之间也是以逗号分隔。

清单 1. JSON 格式的简单 JavaScript 对象

拓展思考

var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin","email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter","email": "jason@servlets.com" }, { "firstName": "Elliotte", "lastName":"Harold","email": "elharo@macfaq.com" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] }

XML和JSON优缺点

如果要以名称/值对将其发送到服务器端,应该如下所示:

拓展思考

var url = "organizePeople.php?people=" + people.toJSONString();xmlHttp.open;xmlHttp.onreadystatechange = updatePage;xmlHttp.send;

XML和JSON优缺点

这看起来不错,但却存在一个问题:在 JSON 数据中会有空格和各种字符,Web
浏览器往往要尝试对其继续编译。要确保这些字符不会在服务器上引起混乱,需要在
JavaScript escape() 函数中做如下添加:

<1>.XML的优点   A.格式统一,符合标准;

var url = "organizePeople.php?people=" + escape);request.open;request.onreadystatechange = updatePage;request.send;

B.容易与其他系统进行远程交互,数据共享比较方便。

该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成
Web 可用字符(比如,空格会被转换成
%20,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会再把它们转换回它们传输后的本来
“面目”。

<2>.XML的缺点   A.XML文件庞大,文件格式复杂,传输占带宽;

这种做法的缺点有两个:

B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;

在使用 GET 请求发送大块数据时,对 URL
字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON
字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。
在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。

C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;

简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON
数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用
POST 请求。

D.服务器端和客户端解析XML花费较多的资源和时间。

利用 POST 请求发送 JSON 数据

<1>.JSON的优点:

当决定使用 POST 请求将 JSON
数据发送给服务器时,并不需要对代码进行大量更改,如下所示:

A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

var url = "organizePeople.php?timeStamp=" + new Date;request.open;request.onreadystatechange = updatePage;request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");request.send);

B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;

这些代码中的大部分,您都在 “ 掌握 Ajax,第 3 部分:Ajax
中的高级请求和响应” 中见过,应该比较熟悉,第 3 部分重点介绍了如何发送
POST 请求。请求使用 POST 而非 GET 打开,而且 Content-Type
头被设置为让服务器预知它能得到何种数据。在这种情况下,即为
application/x-www-form-urlencoded,它让服务器知道现在发送的是文本,正如它从常规的
HTML 表单中得到的一样。

C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript,
Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;

另 一个简单提示是 URL
的末尾追加了时间。这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发;此
URL 会由于时间戳的不同而稍微有些不同。这种技巧常被用于确保到脚本的 POST
每次都会实际生成新请求且 Web 服务器不会尝试缓存来自服务器的响应。

D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;

JSON 就只是文本

E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

不管使用 GET 还是 POST,关键之处在于 JSON
就只是文本。由于不需要特殊编码而且每个服务器端脚本都能处理文本数据,所以可以轻松利用
JSON 并将其应用到服务器。假如 JSON
是二进制格式的或是一些怪异的文本编码,情况就不这么简单了;幸好 JSON
只是常规的文本数据(正如脚本能从表单提交中所接收到的数据,在 POST 段和
Content-Type 头中亦可以看出),所以在将数据发送到服务器时无需太费心。

<2>.JSON的缺点

在服务器上解释 JSON

A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

一 旦您编写完客户端 JavaScript 代码、允许用户与 Web 表单和 Web
页的交互、收集发送给服务器端程序以做处理所需的信息,此时,服务器就成为了应用程序(如果调用了异步使用的服务器端程序,则可能是我们认为的所谓的
“Ajax 应用程序”)中的主角。在此时,您在客户端所做的选择(比如使用
JavaScript 对象,然后将其转换成 JSON
字符串)必须要与服务器端的选择相匹配,比如使用哪个 API 解码 JSON 数据。

B.JSON格式目前在Web Service中推广还属于初级阶段。

处理 JSON 的两步骤

<1>.JSON的优点:

不管在服务器端使用何种语言,在服务器端处理 JSON 基本上就需要两个步骤。

A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

针对编写服务器端程序所用的语言,找到相应的 JSON 解析器/工具箱/帮助器
API。 使用 JSON 解析器/工具箱/帮助器 API
取得来自客户机的请求数据并将数据转变成脚本能理解的东西。

B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;

以上差不多就是目前所应了解的大致内容了。接下来,我们对每个步骤进行较为详细的介绍。

C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript,
Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;

寻找 JSON 解析器

D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;

寻找 JSON 解析器或工具箱最好的资源是 JSON 站点。
在这里,除了可以了解此格式本身的方方面面之外,还可以通过各种链接找到
JSON 的各种工具和解析器,从 ASP 到 Erlang,到 Pike,再到
Ruby,应有尽有。您只需针对自己编写脚本所用的语言下载相应的工具箱即可。为了让服务器端脚本和程序能够使用此工具箱,可以根据情况对其进行选择、扩
展或安装(如果在服务器端使用的是 C#、PHP 或 Lisp,则可变性更大)。

E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

例如,如果使用的是 PHP,可以简单将其升级至 PHP 5.2 并用它完成操作;在
PHP 这个最新版本默认包含了 JSON 扩展。实际上,那也是在使用 PHP 时处理
JSON 的最好方法。如果使用的是 Java servlet,json.org 上的 org.json
包显然就是个不错的选择。在这种情况下,可以从 JSON Web 站点下载 json.zip
并将其中包含的源文件添加到项目构建目录。编译完这些文件后,一切就就绪了。对于所支持的其他语言,同样可以使用相同的步骤;使用何种语言取决于您对该语
言的精通程度,最好使用您所熟悉的语言。

<2>.JSON的缺点

使用 JSON 解析器

A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

一旦获得了程序可用的资源,剩下的事就是找到合适的方法进行调用。比如,假设为
PHP 使用的是 JSON-PHP 模板:

B.JSON格式目前在Web Service中推广还属于初级阶段。

// This is just a code fragment from a larger PHP server-side scriptrequire_once;$json = new Services_JSON();// accept POST data and decode it$value = $json->decode($GLOBALS['HTTP_RAW_POST_DATA']);// Now work with value as raw PHP

<2>.JSON的缺点

通过该模板,可将获得的所有数据(数组格式的、多行的、单值的或 JSON
数据结构中的任何内容)转换成原生 PHP 格式,放在 $value 变量中。

A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

如果在 servlet 中使用的是 org.json 包,则会使用如下代码:

B.JSON格式目前在Web Service中推广还属于初级阶段。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StringBuffer jb = new StringBuffer(); String line = null; try { BufferedReader reader = request.getReader(); while ((line = reader.readLine jb.append; } catch  { //report an error } try { JSONObject jsonObject = new JSONObject; } catch  { // crash and burn throw new IOException("Error parsing JSON request string"); } // Work with the data using methods like... // int someInt = jsonObject.getInt; // String someString = jsonObject.getString; // JSONObject nestedObj = jsonObject.getJSONObject; // JSONArray arr = jsonObject.getJSONArray; // etc...}

7.参考文献

参考一:百度

参考二:小课堂

8.更多讨论

欢迎大家交流和讨论

参考文献

参考:百度

文本链接:文本链接

视频链接:视频地址

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~


技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧 !

发表评论

电子邮件地址不会被公开。 必填项已用*标注