php中JSON的使用与转换


Posted in PHP onJanuary 14, 2015

在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考。内容如下

从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。

一、json_encode()

<?php

$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

echo json_encode($arr);

?>

输出

{"a":1,"b":2,"c":3,"d":4,"e":5}

再看一个对象转换的例子:

$obj->body           = 'another post';

$obj->id             = 21;

$obj->approved       = true;

$obj->favorite_count = 1;

$obj->status         = NULL;

echo json_encode($obj);

 输出

{
 "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)转为对象格式。

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

$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"}

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

如果你需要将"索引数组"强制转化成"对象",可以这样写

json_encode( (object)$arr );

 或者

json_encode ( $arr, JSON_FORCE_OBJECT );

 三、类(class)的转换

下面是一个PHP的类:

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_decode()

该函数用于将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));

 结果就是生成一个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)

}

五、json_decode()的常见错误

下面三种json写法都是错的,你能看出错在哪里吗?

$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。

var_dump(json_decode("Hello World")); //null

以上就是本文的全部内容了,希望大家能够喜欢,看完之后能够有所得

PHP 相关文章推荐
基于PHP与XML的PDF文档生成技术
Oct 09 PHP
浅谈PHP语法(1)
Oct 09 PHP
php面向对象全攻略 (十四) php5接口技术
Sep 30 PHP
PHP排序之二维数组的按照字母排序实现代码
Aug 13 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
php学习笔记之面向对象
Nov 08 PHP
PHP动态规划解决0-1背包问题实例分析
Mar 23 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 PHP
php rsa加密解密使用详解
Jan 14 #PHP
ThinkPHP 404页面的设置方法
Jan 14 #PHP
THINKPHP内容分页代码分享
Jan 14 #PHP
php+mysql删除指定编号员工信息的方法
Jan 14 #PHP
php实现redis数据库指定库号迁移的方法
Jan 14 #PHP
php导入excel文件到mysql数据库的方法
Jan 14 #PHP
php+mysql查询优化简单实例
Jan 13 #PHP
You might like
一个ftp类(ini.php)
2006/10/09 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
vue实现购物车加减
2020/05/30 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
python批量下载图片的三种方法
2013/04/22 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
Python中os模块功能与用法详解
2020/02/26 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
播音主持专业个人自我评价
2014/01/09 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
经济职业学院毕业生自荐书
2014/03/17 职场文书
分家协议书
2014/04/21 职场文书
文艺晚会策划方案
2014/06/11 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
民事和解协议书格式
2014/11/29 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL