目前比较流行的两种数据交换格式,分别是XML和JSON。XML具有清晰的DOM结构和树形层级关系,每个属性都含有开始和结束标签,但这也意味着文件的体积可能更大;JSON采用key-value键值对的方式组织数据,额外字符较少,因此文件体积小,而且JSON更符合主流语言如JavaScript和PHP等语言中对象的数据解析习惯,于是JSON大行其道。

总的来说ML比较适合于标记文档,而JSON却更适于进行数据交换处理。

最近在写APP 应用的数据接口,需要接受客户端传来的JSON数据,并在服务器端将处理好的数组会对象以JSON格式发至客户端。可见JOSN在数据交换中的重要,于是,便有了此文,作为记录。

JSON函数

从 PHP 5.2 开始,PHP原生内置了json_encode()和json_decode()函数,前者用于编码,后者用于解码。

JSON函数如下:

JSON函数 描述
json_decode 对 JSON 格式的字符串进行解码。
json_encode 对变量进行 JSON 编码。
json_last_error_msg 返回上一次发生的错误。
json_last_error 返回最后发生的错误。

1. json_decode()——解码

1.1 json_decode()的语法:

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

参数:

  • json:待解码Json格式的字符串(数据必须为UTF-8编码格式);
  • assoc:当该参数为true时,将返回 array类型;当该参数为false时,将返回object类型;
  • depth:指定复杂递归的深度;
  • options:JSON解码的位掩码的选项。当前仅支持JSON_BIGINT_AS_STRING(默认师将大整数强制类型转换为浮点数);

1.2 使用方法:

1.2.1 将Json字符串以object类型进行解码:

<?php
$json = '{"a":1,"b":2,"c":3}';
var_dump(json_decode($json)); 
?>

输出如下:

object(stdClass)#1 (3) {
  ["a"]=>int(1)
  ["b"]=>int(2)
  ["c"]=>int(3)
}

1.2.2 将Json字符串以array类型进行解码:

<?php
$json = '{"a":1,"b":2,"c":3}';
var_dump(json_decode($json, true)); 
?>
`

输出如下:

array(3) {
  ["a"]=>int(1)
  ["b"]=>int(2)
  ["c"]=>int(3)
}

1.3 常见的坑:

1.3.1 json_decode()只接受utf-8编码的字符,否则会得到空字符串或NULL;

1.3.2 json格式的字符串,要注意双引号与单引号的使用:

  • 1)json字符串用单引号,json字符串中的数据(键/值)用双引号;
  • 2)json字符串的数据,其中"键"必须使用双引号;

1.3.3 json_decode()中的第一个参数只能是数组或对象形式的json字符串,不允许是一个字符串或一个数组的json字符串。

2. json_encode()——编码

2.1 json_encode()的语法:

string json_encode ( mixed $value [, int $options = 0 ] )

参数:

  • value:待编码的value,除 resource 类型之外,可以为任何数据类型(数据必须为UTF-8编码格式);
  • options:二进制掩码。可选值有:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE。

2.2 使用方法:

1.2.1 将数组编码为Json字符串:

<?php
$arr = array ('a'=>1,'b'=>2,'c'=>3);
echo json_encode($arr);
?>

输出如下:

{"a":1,"b":2,"c":3}

2.3 常见的坑:

2.3.1 索引数组与关联数组:

json_decode()会将索引数组(只保存值)输出的字符串转为数组格式,而将关联数组(保存键值对)输出的字符串转为对象格式。

当数组为索引数组时,输出的字符串为数组格式:

$arr = array('a', 'b', 'c');
echo json_encode($arr);

  
输出结果为:

["a", "b", "c"]

而当数组为关联数组时,输出的字符串为对象格式:

$arr = array('1'=>'a', '2'=>'b', '3'=>'c');
echo json_encode($arr);

输出结果为:

{"1":"a","2":"b","3":"c"}

如果需要将索引数组在转化为json字符串时,强制输出的字符串为对象格式,方法如下:

json_encode( (object)$arr );

或者:

json_encode ( $arr, JSON_FORCE_OBJECT );

3. json_last_error() —— 返回最后发生的错误

语法:

int json_last_error ( void )

如果有,返回 JSON 编码解码时最后发生的错误。

参考链接:《json_last_error

4. json_last_error_msg() —— 返回上一次发生的错误

语法:

string json_last_error_msg ( void )
本文作者:子匠_Zijor,转载请注明出处:http://www.dengzhr.com/others/backend/php/755