侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

php语言中使用json的技巧及json的实现代码详解

php  /  管理员 发布于 7年前   175

目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。

我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识。

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

一、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编码的时候,这一点要特别注意。

二、索引数组和关联数组

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语言的json实现

由于开发一个ajax file manager for web开源项目,数据交换使用的json格式,后来发现在低版本的php上运行会有问题,仔细调试发现json_decode和json_encode无法正常工作,于是查阅资料,发现低版本的php没有实现这两个函数,为了兼容性,我只好自己实现一个php版的json编码解码代码,并保证和json2.js的一致,测试调试并通过,现在将其公布出来,供有相同需求的同学使用:

 )     {       $result = (array) json_decode($json);     }     else     {       $json = str_replace(array("\\\\", "\\\""), array("", ""), $json);       $parts = preg_split("@(\"[^\"]*\")|([\[\]\{\},:])|\s@is", $json, -, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);       foreach ($parts as $index => $part)       {         if (strlen($part) == )         {           switch ($part)           { case "[": case "{":   $parts[$index] = "array(";   break; case "]": case "}":   $parts[$index] = ")";   break; case ":":   $parts[$index] = "=>";   break; case ",":   break; default:   break;           }         }       }       $json = str_replace(array("", "", "$"), array("\\\\", "\\\"", "\\$"), implode("", $parts));       $result = eval("return $json;");     }   }   catch (Exception $e)   {     $result = array("error" => $e->getCode());   }   return $result; } function valueTostr($val) {   if (is_string($val))    {     $val = str_replace('\"', "\\\"", $val);     $val = str_replace("\\", "\\\\", $val);     $val = str_replace("/", "\\/", $val);     $val = str_replace("\t", "\\t", $val);     $val = str_replace("\n", "\\n", $val);     $val = str_replace("\r", "\\r", $val);     $val = str_replace("\b", "\\b", $val);     $val = str_replace("\f", "\\f", $val);     return '"' . $val . '"';   }   elseif (is_int($val))     return sprintf('%d', $val);   elseif (is_float($val))     return sprintf('%F', $val);   elseif (is_bool($val))     return ($val ? 'true' : 'false');   else     return 'null'; } function jsonEncode($arr) {   $result = "{}";   try   {     if (PHP_VERSION_ID > )     {       $result = json_encode($arr);     }     else     {       $parts = array();       $is_list = false;       if (!is_array($arr))       {         $arr = (array) $arr;       }       $end = count($arr) - ;       if (count($arr) > )       {         if (is_numeric(key($arr)))         {           $result = "[";for ($i = ; $i < count($arr); $i++)           { if (is_array($arr[$i])) {   $result = $result . jsonEncode($arr[$i]); } else {   $result = $result . valueTostr($arr[$i]); } if ($i != $end) {   $result = $result . ","; }           }           $result = $result . "]";         }         else         {           $result = "{";$i = ;           foreach ($arr as $key => $value)           { $result = $result . '"' . $key . '":'; if (is_array($value)) {   $result = $result . jsonEncode($value); } else {   $result = $result . valueTostr($value); } if ($i != $end) {   $result = $result . ","; } $i++;           }           $result = $result . "}";         }       }       else       {         $result = "[]";       }     }   }   catch (Exception $e)   {   }   return $result; } ?> 

如果使用过程有什么问题,可以给我email.欢迎大家指出错误!

您可能感兴趣的文章:

  • 使用JSON实现数据的跨域传输的php代码
  • php中json_decode()和json_encode()的使用方法
  • 使用PHP接收POST数据,解析json数据
  • 解析PHP 使用curl提交json格式数据
  • 如何在php中正确的使用json
  • php使用curl发送json格式数据实例
  • php使用json_encode对变量json编码
  • 教你如何使用PHP输出中文JSON字符串
  • PHP中使用json数据格式定义字面量对象的方法
  • PHP使用json_encode函数时不转义中文的解决方法
  • ThinkPHP中使用ajax接收json数据的方法
  • php中JSON的使用与转换


  • 上一条:
    php邮件发送的两种方式
    下一条:
    php+ajax实现无刷新的新闻留言系统
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客