果冻想
认真玩技术的地方

JSON入门教程

前言

记得第一次接触JSON时,还是那年在深圳做游戏开发。游戏客户端和服务器之间进行交互的数据格式就是JSON格式的;同时,在MySQL数据库中,很多表中的字段存储的内容也是JSON格式的。发现这货用起来很方便,很好用,后来进一步了解了一下,发现在很多地方都能看到JSON的身影,所以决定写这篇文章来对JSON做个简单的总结。

什么是JSON?

JSON(JavaScript Object Notation)是一种基于文本的标准数据交换格式,使应用程序通过计算机网络交换数据。因为JSON独立于编程语言和计算平台,因此用Ruby,Java/EE,Javascript,C#/.Net,PHP等编程语言写的程序,可以很容易的使用和产生JSON数据。而与JSON相关的API和工具十分丰富,这让你很容易的将JSON运用在你喜爱的编程语言,IDE和运行环境里。此外,流行的NoSQL数据库,诸如MongoDB和ConchBase,都是基于JSON的。

JSON是一种简单的数据格式,它有三种基本的数据结构:

  • 键/值对
    { 
        "firstName": "John"
    }
    
  • 对象
    {
        "address":{
            "line1":"555 Main Street",
            "city":"Denver",
            "stateOrProvince":"CO",
            "zipOrPostalCode":"80202",
            "country":"USA"
        }
    }
    
  • 数组
    {
        "people":[
            {"firstName":"John", "lastName":"Smith", "age":35},
            {"firstName":"Jane", "lastName":"Smith", "age":32}
        ]
    }
    

为什么要用JSON?

在因特网上,JSON正逐渐代替XML成为首选的数据交换格式,这是因为JSON容易阅读并且它的结构匹配常见的编程概念,诸如对象和数组。JSON也比XML更高效(即更快的解析和网络传输),这是因为JSON更紧凑——没有开始和结束标签。

JSON已经是JavaScript标准的一部分。目前,主流的浏览器对JSON支持都非常完善。应用JSON,我们可以从XML的解析中摆脱出来,对那些应用Ajax的Web 2.0网站来说,JSON确实是目前最灵活的轻量级方案。

JSON语法

符号 说明
[]中括号 表示数组
{} 表示对象
:冒号 key和value之间的分隔符
, 用于分隔每一个单独的数据对象

JSON能够通过2种数据结构化数据类型和4种基本数据类型来表示。

数据类型 示例
对象 {"x":1,"y":2,"val":"foobar"}
数组 [1,2,true,'hello']
字符串 “jellythink”
数值 360,3.14
布尔型 true或者false
null null

"纸上得来终觉浅 绝知此事要躬行",下面分别通过JavaScript和PHP来操作JSON,看看在实际开发中如何使用JSON。

JavaScript中使用JSON

在JSON诞生之初JavaScript处理JSON的方式基本就靠eval()函数。eval()函数可以解析JSON,然后返回JavaScript数组。但是由于eval()存在安全的风险,因此在EMCAScript 5开始有了一个新的全局对象——JSON,使用该对象用来处理JSON。在我们现有的一个只能运行在IE6上的系统,就存在着大量这样的代码:

// 必须把文本包围在括号中,这样才能避免语法错误
var obj = eval ("(" + str + ")");

对于JSON全局对象,我们经常使用以下两个方法:

方法名 说明
stringify() 序列化JSON,将JavaScript对象或数组转换成JSON字符串
parse() 解析JSON,将JSON字符串解析成JavaScript对象或数组

下面就详细的说说上面的两个方法。

JavaScript使用JSON对象的stringify()方法来序列化JSON。

<script type="text/javascript">
    var arr = [1, 3, 8];
    var strJson = JSON.stringify(arr);
    console.log(strJson); // [1, 3, 8]

    var personObj = {name:"Jelly", age:25, phone:"13851389138", QQ:"38624710"}
    strJson = JSON.stringify(personObj);
    console.log(strJson); // {"name":"Jelly","age":25,"phone":"13851389138","QQ":"38624710"}
</script>

JSON.stringify()方法在默认情况下输出的JSON字符串不包含空格字符和缩进。同时,如果JavaScript对象当中包含不被JSON支持的类型(如:undefined,函数)会自动被stringigy()方法忽略。

JSON.stringify()方法包含三个参数,第一个参数就是要序列化的JavaScript对象;第二个参数完成过滤输出结果功能;第三个参数控制输出字符串的缩进。

关于这些参数的具体使用以及示例请参见这里

JavaScript使用JSON对象的parse()方法来解析JSON。

<script type="text/javascript">
    var strJson = '[1, 3, 8]';
    var arr = JSON.parse(strJson);
    for (var i in arr)
    {
        console.log(i + ":" + arr[i]);
    }

    strJson = '{"name":"Jelly","age":25,"phone":"13851389138","QQ":"38624710"}';
    var personObj = JSON.parse(strJson);
    for (var i in personObj)
    {
        console.log(i + ":" + personObj[i]);
    }
</script>

关于parse()更详细的内容请参考这里

PHP中使用JSON

在PHP中,主要使用以下两个函数来完成序列化JSON和解析JSON。

方法名 说明
json_encode 序列化JSON,将PHP对象或数组转换成JSON字符串
json_decode 解析JSON,将JSON字符串解析成PHP对象或数组

先来简单的看看如何使用上面的两个函数。

<?php
    // JSON编码
    $arr = array('jellythink', 28, '果冻想');
    $strJson = json_encode($arr);
    echo var_dump($strJson); // string(38) "["jellythink",28,"\u679c\u51bb\u60f3"]"

    // JSON解码
    $arrDecode = json_decode($strJson);
    echo var_dump($arrDecode); // array(3) { [0]=> string(10) "jellythink" [1]=> int(28) [2]=> string(9) "果冻想" }
?>

在使用上述的两个函数时,还是蛮简单的,但是有一点,我们经常会晕的,就是搞不清楚什么时候会序列化为JSON数组字符串还是序列化为JSON对象字符串。比如为什么我输出的是{"1":"item1","2":"item2","3":"item3"}而不是["item1","item2","item3"]。下面就来说说这个问题。

首先PHP中有以下两种形式的数组:

<?php
    // 索引数组
    $arr = ['item1', 'item2', 'item3'];

    // 关联数组
    $arr = [
      'name' => '张三',
      'age' => '22',
    ];
?>

而对于JavaScript来说,它就一种索引数组的;对于key/value这种的,在JavaScript中则是对象了。对于何时JSON编码为数组字符串,而何时又编码为对象字符串,看下面的代码。

<?php
  $arr = [ // 不是 0 开始,会输出对象
    1 => 'item1',
    2 => 'item2',
    3 => 'item3',
  ];
  echo "输出对象: ", json_encode($arr), "\n";
  // 输出对象: {"1":"item1","2":"item2","3":"item3"}

  $arr = [ // 连续索引,输出数组
    0 => 'item1',
    1 => 'item2',
    2 => 'item3',
  ];
  echo "输出数组: ", json_encode($arr), "\n";
  // 输出数组: ["item1","item2","item3"]

  $arr = [ // 连续索引,输出数组 
    'item1',
    'item2',
    'item3',
  ];
  echo "输出数组: ", json_encode($arr), "\n";
  // 输出数组: ["item1","item2","item3"]

  $arr = [ // 索引不连续,输出对象
    0 => 'item1',
    1 => 'item2',
    2 => 'item3',
    5 => 'item5',
  ];
  echo "输出对象: ", json_encode($arr), "\n";
  // 输出对象: {"0":"item1","1":"item2","2":"item3","5":"item5"}

  $arr = [ // 包含关联索引,一定输出对象
    0 => 'item1',
    1 => 'item2',
    2 => 'item3',
    'other' => '其他字段'
  ];
  echo "输出对象: ", json_encode($arr), "\n";
  // 输出对象: {"0":"item1","1":"item2","2":"item3","other":"\u5176\u4ed6\u5b57\u6bb5"}

  // 关联数组 + 索引数组 实例
  $arr = [ // 关联数组
    'other' => '其他字段',
    'count' => 3, // 数组个数
    'list' => [ // 索引数组
      'item1',
      'item2',
      'item3',
    ],
  ];
  echo "对象+数组: ", json_encode($arr), "\n";
  // 对象+数组: {"other":"\u5176\u4ed6\u5b57\u6bb5","count":3,"list":["item1","item2","item3"]}
?>

上面这段代码基本对常见的几种数组的JSON编码都进行了总结,至于何时生成数组字符串,又何时生成对象字符串,请对号入座。

对于上面总结,如果觉的晕的话,可以看看json_encode函数的第二个参数,这个参数对进行JSON编码时有一些选项控制,比如:我们可以使用JSON_FORCE_OBJECT设置在所有情况下都生成对象字符串等。

综上所述,我们可以简单的得出这样的结论:

如果要编码的数组的键不是从0开始的数字,所有的键将会被当作字符串,并明确声明为key-value对,进行JSON编码时,则会生成对象字符串。

对于json_decode来说,没有什么好说的,但是可以关注一下它的第二个参数,当该参数为TRUE时,将统一返回array,而不是object。

关于json_encodejson_decode更多详细的内容,可以查看PHP官方手册

总结

这篇文章对JSON进行了扫盲式的总结,对于自己的一些知识盲点有了一个补充,同时对JSON也有了更多的了解。希望我的这篇文章对你入门JSON有一定的帮助。

果冻想,认真玩技术的地方。

2016年5月30日 于呼和浩特。

推荐阅读

  1. JSON.parse与eval()对于解析json的问题
未经允许不得转载:果冻想 » JSON入门教程
网站维护离不开您的支持,您可以赞助本站,谢谢支持
×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

赞助本站
关注微信公众号
关注微信公众号和果冻一起分享你的疑惑与心得。
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

玩技术,我们是认真的

联系我们关于果冻