PHP - JSON对象在数据库的存储与获取

需求缘由

在最近的项目开发中,有一个需求是将UserTable中的一个字段设计成可自定义拓展的。第一个想法是用特殊标识过的字符串存入,再根据要求来获取,这当然会涉及极多的字符串操作,肯定是不推荐的。第二个想法是,将键值对变成一个JSON对象存入,需要用时再将整个JSON对象取出后进行操作,事实证明这样做可行性大的多。

设计与实现

将键值对变成JSON对象,存入数据库

这里假设有一组键值对,将要存入到我们数据库User表的一个字段‘user_defined’ 中,那么我们首先构建这组键值对的时候用的载体是一个数组

//Defined array and set key&value
$array = ['wechat' => 'mr_season_', 'qq' => '476688715', 'weibo' => 'MrSeason'];

将数组用PHP内置函数 json_encode() 处理后变成一个JSON对象,存入数据库

$json = json_encode($array); 

//Update $json into database

echo $json; 

//The echo result
//{"wechat":"mr_season_","qq":"476688715","weibo":"MrSeason"}
//可以看到已经从 ‘[]’(数组) 变成 ‘{}’(对象),这是对关联数组的特别处理,为了是解决JavaScript不支持关联数组的问题。

将JSON对象从数据库取出,还原为键值对

当我们从数据库取出后该JSON对象后,接下来就是将其变成方便我们操作的数组。

//get $json from database
$array = json_decode($json, true)

//json_decode的第二个参数填true,就会返回array对象,该参数为空,返回的是一个PHP的Object对象,这点可以从该函数的源码注释读出,以下是我摘抄的一段注释
/**
...
 * @param bool $assoc [optional] <p>
 * When <b>TRUE</b>, returned objects will be converted into
 * associative arrays.
...
 */

echo $array; 

//The echo result
/**
{
  "wechat": "mr_season_",
  "qq": "476688715",
  "weibo": "MrSeason"
}
*/
//此时已经可以用诸如$array['wechat']来取值或者用foreach来遍历整个$array了

总结

可以看到本次主题的实现主要依赖json_encode()与json_decode()两个PHP的内置函数,关于PHP源码对这两个函数的注释这里不再贴出,有兴趣的朋友可以自行阅读,不过有两个要点还是要注意下的

  • php版本 >= 5.2
  • 当有中文时必须用Utf-8编码

JSON在开发API时是非常重要的一种数据格式,所以JSON在PHP中的用法也显得格外重要。

Contact me

如果有什么错误或者建议 OR 如果需要请教关于本主题的相关问题
欢迎来邮与我交流和讨论!
Email:atrovervan@gmail.com

2016-10-06 19:34 140
Comments
Write a Comment