PHP使用JSON和将json还原成数组


Posted in PHP onFebruary 12, 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);

 输出

[/code]
{

 "body":"another post",

 "id":21,

 "approved":true,

 "favorite_count":1,

 "status":null
 }
[/code]

 由于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 Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
php在字符串中查找另一个字符串
Nov 19 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
php class中self,parent,this的区别以及实例介绍
Apr 24 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
PHP基本语法实例总结
Sep 09 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 PHP
服务器上配置PHP运行环境教程
Feb 12 #PHP
PHP保存带BOM文件的方法
Feb 12 #PHP
自己写的php curl库实现整站克隆功能
Feb 12 #PHP
PIGCMS 如何关闭聊天机器人
Feb 12 #PHP
PHP实现抓取Google IP并自动修改hosts文件
Feb 12 #PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 #PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 #PHP
You might like
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
php获取apk包信息的方法
2014/08/15 PHP
PHP递归创建多级目录
2015/11/05 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python生成器以及应用实例解析
2018/02/08 Python
python实现简易通讯录修改版
2018/03/13 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
DELPHI面试题研发笔试试卷
2015/11/08 面试题
超市创业计划书
2014/04/24 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
开票证明
2015/06/23 职场文书
导游词之日本富士山
2020/01/06 职场文书