如何在php中正确的使用json_php技巧

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

1、json_encode()
该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:
$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编码的时候,这一点要特别注意。

2、索引数组和关联数组
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 );

3、类(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),其他东西(常量、私有变量、方法等等)都遗失了。

4、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)
}

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

时间: 2024-12-04 10:34:00

如何在php中正确的使用json_php技巧的相关文章

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait.notify 和 notifyAll 来实现线程间的通信..举个例子,如果你的Java程序中有两个线程--即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空).相应的,消费者可以通知生产者可以开始生成更多的数据,因为当它消耗掉某些数据后缓冲区不再

如何在Excel中正确输入分数

在使用Excel制作数据表时,经常会输入分数.例如在一些股票市场报价表中,会用分数而不是小数来显示数据.很多朋友在输入分数时会遇到这样那样的问题,例如输入分数后却自动变成了日期等.本文将帮助大家解决此类问题. 技巧一 在Excel输入分数时,先输入整数,然后加一空格,再输入分数(用斜线的方式,例如5/8),用这种方法,可以创建如图1所示的股票报价表. 图1 技巧二 问题:如果只是想输入5/8,前面没有整数,输入完成后,一回车,你会发现分数变成了日期(即5月8日).这当然不是我们希望看到的结果.如

如何在Excel中正确打印不连续区域的数据

如果遇到一个较大的Excel工作表,却需要打印一些不连续区域的数据,应该怎么办呢?其实我们可以用Excel的"视面管理器"就可以解决不连续区域打印问题了. 1. 启动Excel,打开相应的工作簿文件. 2. 执行"视图→视面管理器"命令,打开"视面管理器"对话框,单击其中的"添加"按钮,在随后弹出的"添加视图"对话框中,输入一个名称(如"全部"等),确定返回. 3. 按住Ctrl键,然后

如何在HTML 中嵌入 PHP 代码_php技巧

对于一个有经验的 PHP Web 开发者,这是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.所以这里介绍如何在常规的 HTML 代码中嵌入 PHP 代码. 在常规的 HTML 中嵌入 PHP 代码 创建一个 hello 脚本,命名为 hello.php: <html> <head> <title>PHP Test</title> </head> <body> <?php echo '<p&g

以前收集的一些资料---如何在ASP中通过ODBC调用Excel中的数据

excel|odbc|数据                如何在ASP中通过ODBC调用Excel中的数据    在ASP中通过ODBC调用Excel中的数据方式和普通的通过ODBC调用数据库的方式有一些不同的地方.下面将介绍如何通过ODBC在ASP中使用Excel的数据.    在使用的过程中,要注意的是你需要使用的ODBC驱动为:Microsoft ODBC Driver for Excel. 下面给出一个例子来具体说明如何调用的过程:1.在Excel的电子表格中新建一个叫Range的表单a

如何在JSP中处理中文

js|中文 如何在JSP中处理中文 在一个Web应用中经常需要向服务器传递一些参数,一般通过form向服务器发送一个POST请求.在参数中有可能包含中文信息,如用户信息登记.购物定单中的地址信息等等.参数字符串一般用本地字符集进行编码,如中文采用GB2312或GBK字符集,英文或西欧文字采用ISO8859_1字符集,但在Java程序中一律采用Unicode处理字符串,这就需要有一个编码转换的过程.不幸的是,现有的大部分Java应用服务器都是在英语国家开发出来的,由于缺乏大字符集(中文.日文.韩文

如何在 vim 中更好的编辑 java 文件

这次介绍一下如何在 vim 中更好的编辑 java 文件.作者: camry.wu@gmail.com 1. javabrowser 编辑类文件时, 类资源树是个有用的东西, 可以把类的成员, 方法等等很直观的 显示出来. 在 vim 中也可以实现好像 vc, jbuilder 那样的类资源树, 当然比 那些会简单些, 不过也够好用的了. 就是用 javabrowser.vim 这个脚本实现的. 先到 vim online 去找到这个脚本文件.(在这还能找到许多有用的其他脚本) 然后在 goog

如何在Frontpage2003中运用css设置网页字体

css|frontpage|网页 在网页界面的设计过程中,许多人考虑最多的是用什么图形与色彩来装饰网页,或是在网页上加上什么动画特效:而对于网页的字体却不太重视.结果往往是有些网站的字体不是太小就是太大,严重影响阅览;而有的网站整页用的都是标准字体,毫无个性而言.其实,字体作为网站内容的载体,有其独特的重要性,是不应该忽视的. 运用Html,我们可以对字体的大小及字形进行简单的修改,但要进行统一地控制.创建特殊效果,就必须要用到css.它能让您更有效地控制网页外观,并可以扩充精确指定网页元素位置

如何在C#中加载自己编写的动态链接库(DLL)

动态|加载|链接 摘要 本文主要讲述如何在C#中逐步实现加载自己用C++语言编写的动态链接库,以及在导入时如何进行C#和C++语言的数据类型匹配 关键词 C# C++ 动态链接库 加载 数据类型匹配 一.发生的背景 在开发新项目中使用了新的语言开发C#和新的技术方案WEB Service,但是在新项目中,一些旧的模块需要继续使用,一般是采用C或C++或Delphi编写的,如何利用旧模块对于开发人员来说,有三种可用方法供选择:第一.将C或C++函数用C#彻底改写一遍,这样整个项目代码比较统一,维护