***在PHP语言中使用JSON和将json还原成数组(json_decode()的常见错误)
在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考。内容如下
从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。
一、json_encode()
|
1
2
3
4
|
<?php$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);echo json_encode($arr);?> |
输出
|
1
|
{"a":1,"b":2,"c":3,"d":4,"e":5} |
再看一个对象转换的例子:
|
1
2
3
4
5
6
|
$obj->body = 'another post';$obj->id = 21;$obj->approved = true;$obj->favorite_count = 1;$obj->status = NULL;echo json_encode($obj); |
输出
|
1
2
3
4
5
6
7
8
9
10
11
|
{ "body":"another post", "id":21, "approved":true, "favorite_count":1, "status":null } |
由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。
二、索引数组和关联数组
PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。
由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。
比如,现在有一个索引数组
|
1
2
3
|
$arr = Array('one', 'two', 'three');echo json_encode($arr); |
输出
|
1
|
["one","two","three"] |
如果将它改为关联数组:
|
1
2
3
|
$arr = Array('1'=>'one', '2'=>'two', '3'=>'three'); echo json_encode($arr); |
输出变为
|
1
|
{"1":"one","2":"two","3":"three"} |
注意,数据格式从"[]"(数组)变成了"{}"(对象)。
如果你需要将"索引数组"强制转化成"对象",可以这样写
|
1
|
json_encode( (object)$arr ); |
或者
|
1
|
json_encode ( $arr, JSON_FORCE_OBJECT ); |
三、类(class)的转换
下面是一个PHP的类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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转换:
|
1
2
3
4
5
|
$foo = new Foo;$foo_json = json_encode($foo);echo $foo_json; |
输出结果是
|
1
|
{"public_ex":"this is public"} |
可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。
四、json_decode()
该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:
|
1
2
3
4
5
|
$json = '{"foo": 12345}'; $obj = json_decode($json);print $obj->{'foo'}; // 12345 |
通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:
|
1
2
3
|
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); |
结果就是生成一个PHP对象:
|
1
2
3
4
5
6
7
8
9
10
|
object(stdClass)#1 (5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5)} |
如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:
|
1
2
3
|
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json,true)); |
结果就生成了一个关联数组:
|
1
2
3
4
5
6
7
8
9
10
|
array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5)} |
五、json_decode()的常见错误
下面三种json写法都是错的,你能看出错在哪里吗?
|
1
2
3
4
5
|
$bad_json = "{ 'bar': 'baz' }";$bad_json = '{ bar: "baz" }';$bad_json = '{ "bar": "baz", }'; |
对这三个字符串执行json_decode()都将返回null,并且报错。
第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。
另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。
|
1
|
var_dump(json_decode("Hello World")); //null |
***在PHP语言中使用JSON和将json还原成数组(json_decode()的常见错误)的更多相关文章
- PHP语言中使用JSON和将json还原成数组
从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 3 4 <?php $arr = ...
- 在PHP语言中使用JSON和将json还原成数组
在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_deco ...
- 转载:在PHP语言中使用JSON和将json还原成数组
一.json_encode() 1 2 3 4 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); e ...
- 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON
SwiftyJSON能够让在Swift语言中更加简便处理JSON数据. With SwiftyJSON all you have to do is: ? 1 2 3 4 let json = JSON ...
- PHP 将json的stdClass Object转成数组array
PHP和JS通讯通常都用json,但是PHP要用json的数据,通过json_decode转出来的数组并不是标准的array,所以需要用这个函数进行转换. function object_array( ...
- PHP把采集抓取网页的html中的的 去掉或者分割成数组
日期:2017/11/6 操作系统:windows 今天抓取网页的时候出现 无法替换,经过多次测试,找到了办法;(注意是从网页上抓取到的) 分割 explode(" ",HTML ...
- PHP语言中使用JSON
原文地址:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 在PHP语言中使用JSON 目前,JSON已经成为最流行的数据交换格式之一,各 ...
- (转)在PHP语言中使用JSON
原文 : http://www.ruanyifeng.com/blog/2011/01/json_in_php.html --------------------------------------- ...
- [转]在PHP语言中使用JSON
本文转自:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数 ...
随机推荐
- .net mvc ajax 上传文件
1.前端 <div> <input type="file" id="upfile" /> <button type="b ...
- 洛谷 P2146 [NOI2015]软件包管理器 解题报告
P2146 [NOI2015]软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...
- 部署kube-prometheus,添加邮件报警
这个项目出自coreos,已经存在很久了,第一次尝试的时候还很简陋,现在完善了很多. 项目提供了一键部署脚本,跑起来并不难,不过个人感觉要真正掌握并灵活使用并不是很容易. kube version: ...
- 解题:CF1130E Wrong Answer
题面 巧妙构造题 这种题一定要限制一个条件,使得在这个条件下能推出要叉的代码的式子 令序列$a$的第一个元素为负,其余元素为正,且保证序列中至少有两个元素,那么Alice的代码将会从第二个元素开始计算 ...
- POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径)
POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径) Description Background Hugo ...
- 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)
题目 描述 \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...
- c++并发编程之互斥锁(mutex)的使用方法
1. 多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 mutex(互斥锁). 引用 cppreference 的介绍: The mutex class is a synchroni ...
- linux查看进程的线程数
top -H -p $PID #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...
- *p++、(*p)++、*++p、++*p 的区别
int a[5]={1,2,3,4,5};int *p = a; *p++ 先取指针p指向的值(数组第一个元素1),再将指针p自增1: cout << *p++; // 结果为 1 cou ...
- 用yaml来编写配置文件
yaml是一个数据序列化的标准,适用于所有开发语言,最大的特点是可读性好. yaml的一个主要应用方向就是编写配置文件,有非常多的系统和框架采用yaml进行配置. yaml有以下基本规则: 1.大小写 ...