json介绍与在php中的应用

简介: json介绍与在php中的应用

问题导引:数据放在哪?


我们做项目时候第一件事就是考虑数据放在哪(怎么存怎么取)?


目前我们接触到的技术方案中(刚学完js角度),只有文件可以持久化的保存内容(数据),所以一定是用文件存我们要操作的数据。


但是由于我们要存放的是一个有着复杂结构的数据,并不是简简单单的值,所以我们必须设计一种能表示复杂结构数据的方式。


例如,一行为一条数据,不同信息之间用 | 分割,同时约定好每个位置的数据含义:


59d632855434e | 错过 | 梁咏琪 | /uploads/img/1.jpg | /uploads/mp3/1.mp3 
59d632855434f | 开始懂了 | 孙燕姿 | /uploads/img/2.jpg | /uploads/mp3/2.mp3 
59d6328554350 | 一生中最爱 | 谭咏麟 | /uploads/img/3.jpg | /uploads/mp3/3.mp3 
59d6328554351 | 爱在深秋 | 谭咏麟 | /uploads/img/4.jpg | /uploads/mp3/4.mp3


这种方式很简单,但是缺点也非常明显,所以我们迫切需要一个更好更方便的表示有结构数据的方式。


那就是json。


JSON


JSON(JavaScript Object Notation) 是一种通过普通字符串描述数据的手段,用于表示有结构的数据。类似于编程语言中字面量的概念,语法上跟 JavaScript 的字面量非常类似。


1. 数据类型


null


null


string


"hello json"


number


2048


boolean


true


object


{
  "name": "zce",
   "age": 18, 
   "gender": true, 
   "girl_friend": null
 }


array


["zhangsan", "lisi", "wangwu"]


2. 注意


  1. JSON 中属性名称必须用双引号包裹


  1. JSON 中表述字符串必须使用双引号


  1. JSON 中不能有单行或多行注释


  1. JSON 没有 undefined 这个值


3. JSON 表述


有了 JSON 这种格式,我们就可以更加容易的表示拥有复杂结构的数据了。


[
  {
    "id": "59d632855434e",
    "title": "错过", 
    "artist": "梁咏琪",
    "images": ["/uploads/img/1.jpg"], 
    "source": "/uploads/mp3/1.mp3"
  },
  {
    "id": "59d632855434f", 
    "title": "开始懂了", 
    "artist": "孙燕姿",
    "images": ["/uploads/img/2.jpg"],
    "source": "/uploads/mp3/2.mp3" },
  {
    "id": "59d6328554350", 
    "title": "一生中最爱", 
    "artist": "谭咏麟",
    "images": ["/uploads/img/3.jpg"],
    "source": "/uploads/mp3/3.mp3" },
  {
    "id": "59d6328554351", 
    "title": "爱在深秋", 
    "artist": "谭咏麟",
    "images": ["/uploads/img/4.jpg"], 
    "source": "/uploads/mp3/4.mp3"
  }
]


4. json在php中的应用


从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)[2]
  public 'a' => int 1
  public 'b' => int 2
  public 'c' => int 3
  public 'd' => int 4
  public '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 (size=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


原文参考:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html

相关文章
|
PHP 开发工具 开发者
Xdebug在PHP中的应用
Xdebug 是一款非常实用的 PHP 调试工具,它为开发者提供了丰富的功能和便利,帮助开发者更高效地进行调试工作。熟练掌握 Xdebug 的使用方法,对于提高 PHP 开发质量和效率具有重要意义。
616 154
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
389 67
|
SQL 关系型数据库 数据库连接
PHP脚本中应用while循环按照ID顺序列出数据集的技巧。
代码整体运行流程非常简单高效:连接数据库、发送查询、处理结果、关闭连接。下面的步骤是常规的PHP数据库操作流程,无需复杂处理即可实现按ID顺序列出数据集。确保代码清晰,易于理解,且可执行性强。如果在生产环境中应用这段代码,需要注意处理数据库连接的安全性、查询效率以及异常处理等。
266 16
|
存储 监控 NoSQL
在阿里云上构建高性能PHP应用:最佳实践指南
本文档从四个核心方面阐述了系统设计与优化的全面方案:**架构设计原则**包括分层架构(Web/逻辑/数据分离)与无状态设计(Redis会话存储、OSS文件管理);**核心服务选型**推荐高性价比的ECS、高性能Redis企业版及PolarDB数据库等;**性能优化技巧**涵盖代码层面(OPcache、Swoole框架)、数据库优化(复合索引、分库分表)以及进阶容器化和函数计算策略;**监控体系搭建**则通过云监控、ARMS应用监控、日志服务SLS等工具,确保系统稳定高效运行。
365 10
|
存储 自然语言处理 安全
PHP-Casbin:现代化 PHP 应用的权限管理引擎
PHP-Casbin 是基于 PERM 模型的轻量级权限框架,支持 ACL、RBAC、ABAC 等多种访问控制模型,适用于 API 安全控制、企业权限管理等场景。其灵活配置、多语言协同与分布式支持,使其成为现代化 PHP 应用权限管理的首选工具。
487 0
|
PHP 开发者 UED
PHP中的异常处理:理解与应用
在编程的世界中,错误和异常就像是不请自来的客人——总是在你最不希望它们出现的时候敲门。对于PHP开发者来说,学会优雅地处理这些“不速之客”是提升代码质量和用户体验的关键。本文将带你深入理解PHP中的异常处理机制,通过实际的代码示例,展示如何捕获、处理以及自定义异常,让你的应用程序更加健壮和灵活。准备好迎接挑战,让我们共同探索PHP异常处理的奥秘吧!
364 66
|
存储 监控 算法
公司员工电脑监控软件剖析:PHP 布隆过滤器算法的应用与效能探究
在数字化办公的浪潮下,公司员工电脑监控软件成为企业管理的重要工具,它能够帮助企业了解员工的工作状态、保障数据安全以及提升工作效率。然而,随着监控数据量的不断增长,如何高效地处理和查询这些数据成为了关键问题。布隆过滤器(Bloom Filter)作为一种高效的概率型数据结构,在公司员工电脑监控软件中展现出独特的优势,本文将深入探讨 PHP 语言实现的布隆过滤器算法在该软件中的应用。
279 1
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
437 3
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
2788 12
|
缓存 NoSQL PHP
用装饰器模式实现多层缓存:让PHP应用更快更稳
通过装饰器模式实现PHP多层缓存架构,详解如何利用内存、Redis、文件缓存组合提升应用性能。包含设计思路、代码示例与实战效果对比,助您构建高效缓存策略。

热门文章

最新文章