在PHP语言中使用JSON和将json还原成数组,json数组
在之前我写过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中,可以使用session_status()或session_id()来检查会话是否已启动。1)使用session_status()函数,如果返回PHP_SESSION_ACTIVE,则会话已启动。2)使用session_id()函数,如果返回非空字符串,则会话已启动。这两种方法都能有效地检查会话状态,选择使用哪种方法取决于PHP版本和个人偏好。

sessionsarevitalinwebapplications,尤其是在commercePlatform之前。

在PHP中管理并发会话访问可以通过以下方法:1.使用数据库存储会话数据,2.采用Redis或Memcached,3.实施会话锁定策略。这些方法有助于确保数据一致性和提高并发性能。

PHPsessionshaveseverallimitations:1)Storageconstraintscanleadtoperformanceissues;2)Securityvulnerabilitieslikesessionfixationattacksexist;3)Scalabilityischallengingduetoserver-specificstorage;4)Sessionexpirationmanagementcanbeproblematic;5)Datapersis

负载均衡会影响会话管理,但可以通过会话复制、会话粘性和集中式会话存储解决。1.会话复制在服务器间复制会话数据。2.会话粘性将用户请求定向到同一服务器。3.集中式会话存储使用独立服务器如Redis存储会话数据,确保数据共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP会话的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。1.Cookies通过在客户端存储数据来管理会话,简单但安全性低。2.Token-basedAuthentication使用令牌验证用户,安全性高但需额外逻辑。3.Database-basedSessions将数据存储在数据库中,扩展性好但可能影响性能。4.Redis/Memcached使用分布式缓存提高性能和扩展性,但需额外配

Sessionhijacking是指攻击者通过获取用户的sessionID来冒充用户。防范方法包括:1)使用HTTPS加密通信;2)验证sessionID的来源;3)使用安全的sessionID生成算法;4)定期更新sessionID。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 英文版
推荐:为Win版本,支持代码提示!