整理一篇json介绍

转自:http://blog.sina.com.cn/s/blog_7eeb1c4d0100zcas.html

JSON介绍

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是JavaScript语言的一个子集。由于JSON 天生是为JavaScript 准备的,所以对于JS有很好的适用。

JSONXML具有相同特性,但相较于XML更易于人的阅读和编写,同时也易于机器解析和生成。JSONXML数据传输的有效性要高很多。JSON 为 Web 应用开发者提供了另一种数据交换格式,减少了XML解析带来的性能问题和兼容性问题。

 

一、JSON建构于两种结构:

1. “名称/对的集合。不同的语言中,它被理解为对象,纪录,结构,字典,哈希表,有键列表,或者关联数组。

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

如:

{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

 

2. 值的有序列表。在大部分语言中,它被理解为数组。

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

如:

[

{

"UserID":11,

"Name":

{

"FirstName":"Truly",

"LastName":"Zhu"

},

"Email":zhuleipro@hotmail.com

},

{

"UserID":12,

"Name":

{

"FirstName":"Jeffrey",

"LastName":"Richter"

},

 "Email":xxx@xxx.com

}

]

和 XML 一样,JSON 也是基于纯文本的数据格式。JSON 的数据格式非常简单,可以用 JSON传输一个简单的 StringNumberBoolean,也可以传输一个数组,或者一个复杂的 Object 对象,这些结构可以嵌套。

二、JSON的优点

1. 轻量级的数据交换格式:

同样的数据,代码比较少,用起来比较方便。

2. 读写更加容易。

格式简单,示例:

{

       “name”: “apple”,

       “expiry”: “2011/8/23”,

       “price”: 3.99,

       “size”:[

“small”,

“medium”,

“large”

]

       }

3. 易于机器的解析和生成。

JavaScript中,JSON被理解为对象。

4. 便于JavaScript的解析。

例如JavaScript可以用eval直接将JSON变为一个对象来通过key来调用value属性值。

5. JSON支持多语言。

包括:ActionScript, C, C#, ColdFusion, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Lua.

三、JSON缺点:

JSON的缺点也就是XML的优点,因为它的轻量级,其只能表述数据,而不能表述数据的格式。

四、JSON 数据格式解析

(一)JavaScript 处理 JSON 数据

   1.JSON数据转换成JavaScript对象

(1)由于JSONJavaScript的一个子集,因此可以直接在JavaScript中声明一个JSON数据对象。

var myJson = {

"name":"Michael",

"address":

{

"city":"Beijing",

"street":"Chaoyang Road",

"postcode":100025

}

}

(2)利用JQuery函数.getJson()解析JSON文件:

比如json.json放:

[

{

"name":"xujun",

"sex":"",

"home":"nanjing"

},

{

"name":"jack",

"sex":"",

"home":"beijing"

}

]

json.html文件里放:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

<script src="jquery.min.js"></script>

<script>

$(document).ready(function()

{

$.getJSON("json.js", function(json)

{

alert("JSON Data: " + json[0]['name']);

});

});

</script>

</head>

<body>

</body>

</html>

运行弹出;

JSON Data: xujun

JSON返回的数组中的第一组中的name的值。

 

(3)利用AJAX在回传数据时,用jseval_r()函数或jqueryparseJSON()函数将string类型转换成object类型。

Ajax读取JSON格式的数据,需要先用XMLHttpRequest对象的responseText属性读取,然后再用eval_r()构造返回JSON对象的方法,创建JSON对象。

var req = new XMLHttpRequest();

……

var jsondata = eval_r(‘(' + req.responseText + ‘)');

   var jsondata = req.responseText.parseJSON();

(4)利用JSON官方网站提供的JSON解析器和字符转换器json.js中的方法parse(),从一个字符串中解析出JSON对象。

var str name apple price 3.99 ';

var jsondata = JSON.parse(str);

 2.JavaScript对象转换成JSON数据格式

通过引入json.js调用toJSONString()JSON.stringify()来进行转换。

(1)  toJSONString()

示例:

var doc new Array();

doc[0]='0';

doc[1]='1';

document.write(doc.toJSONString())

结果是["0","1"] 

 

(2)  JSON.stringify()

官方定义:JSON.stringify(value, replacer, space)

value 转换对象,通常情况下是对象或是数组

replacer [可选]转换过程的特殊处理,可以是函数或字符串数组

space [可选]设置缩进符

使用示例:

//Example:

text = JSON.stringify(['e', {pluribus: 'unum'}]);

// text is '["e",{"pluribus":"unum"}]'

 

text = JSON.stringify(['e', {pluribus: 'unum'}], null, 't');

// text is '[nt"e",nt{ntt"pluribus": "unum"nt}n]'

 

text = JSON.stringify([new Date()], function (key, value) {

return this[key] instanceof Date ?'Date(' + this[key] + ')': value;});

 // text is '["Date(---current time---)"]'

 

 

(二)PHP处理JSON 数据

JSON搭建了客户端Javascirpt和服务器端PHP的交互桥梁。

PHP生成JSON后的字符串,然后把这个字符串传给前台JavaScriptJavascirpt就可以很容易的将其反JSON然后应用。

PHP5.2开始内置了JSON的支持。PHP中与JSON直接相关的函数只有json_encodejson_decode

1. json_encode

json_encode():对变量进行 JSON 编码。

(1)PHP支持两种数组,一种是只保存""value)的索引数组(indexed array),另一种是保存"名值对"name/value)的关联数组(associative array)。

由于JavaScript不支持关联数组,所以json_encode()只将索引数组转为数组格式,而将关联数组转为对象格式。

比如,现在有一个索引数组

  $arr = Array('one', 'two', 'three');

  echo json_encode($arr);

结果为:

  ["one","two","three"]

如果将它改为关联数组:

  $arr = Array('1'=>'one', '2'=>'two', '3'=>'three');
      echo json_encode($arr);

结果就变了:

  {"1":"one","2":"two","3":"three"}

注意,数据格式从"[]"(数组)变成了"{}"(对象)。

(2)将类转换成JSON数据

 class Foo {

    const ERROR_CODE = '404';

    public $public_ex = 'this is public';

    private $private_ex = 'this is private!';

    protected $protected_ex = 'this should be protected'; 

 

    public function getErrorCode() {

      return self::ERROR_CODE;

    }

  }

现在,对这个类的实例进行JSON转换:

  $foo = new Foo;

  $foo_json = json_encode($foo);

  echo $foo_json;

输出结果是

  {"public_ex":"this is public"}

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。

 

注:json_encode只能接受UTF-8 编码的字符串类型数据,在非UTF-8编码下,中文字符将不可被encode,结果会出来空值,所以可能用到iconv()等编码转换函数配合使用。

2. json_decode

json_decode():接受一个 JSON 格式的字符串并且把它转换为 PHP 变量。

该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:

$json = '{"foo": 12345}';

$obj = json_decode($json);

  print $obj->{'foo'}; // 12345

通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
   var_dump(json_decode($json));// var_dump -- 打印变量的相关信息

结果就是生成一个PHP对象:

  object(stdClass)#1 (5) {

    ["a"] => int(1) 

   ["b"] => int(2)

    ["c"] => int(3)

    ["d"] => int(4)

    ["e"] => int(5)

  }

如果想要强制生成PHP关联数组,json_decode()需要加一个参数true

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

   var_dump(json_decode($json),true);

结果就生成了一个关联数组:

  array(5) {

     ["a"] => int(1)

    ["b"] => int(2)

     ["c"] => int(3)

     ["d"] => int(4)

     ["e"] => int(5)

  }

 

 

参考:

http://www.111cn.net/wy/jquery/34694.htm

http://www.okajax.com/a/200905/php_json.html

http://www.ruanyifeng.com/blog/2011/01/json_in_php.html

http://blog.csdn.net/syhhl007/article/details/1729363

http://hi.baidu.com/yh1350/blog/item/de6d3b16318aa2184a90a7d0.html

http://www.json.org/json-zh.html

http://php.net/manual/zh/ref.json.php

http://www.cnblogs.com/lbk/archive/2006/11/17/563385.html


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值