首页 > 后端开发 > 正文

json框架php 如何正确运用PHP json

2023-09-01 19:36:16 | 我爱编程网

今天我爱编程网小编整理了json框架php 如何正确运用PHP json相关信息,希望在这方面能够更好帮助到大家。

json框架php 如何正确运用PHP json

在PHP中如何使用JSONAPI


这篇文章主要介绍了深入浅析JSONAPI在PHP中的应用,需要的朋友可以参考下
现在服务端程序员的主要工作已经不再是套模版,而是编写基于 JSON 的 API 接口。可惜大家编写接口的风格往往迥异,这就给系统集成带来了很多不必要的沟通成本,如果你有类似的困扰,那么不妨关注一下 JSONAPI ,它是一个基于 JSON 构建 API 的规范标准,一个简单的 API 接口大致如下所示:
JSONAPI
简单说明一下:根节点中的 data 用来放置主对象的内容,其中 type 和 id 是必须要有的字段,用来表示主对象的类型和标识,其它简单的属性统统放置到 attributes 里,如果主对象存在一对一、一对多等关联对象,那么放置到 relationships 里,不过只是通过 type 和 id 字段放置一个链接,关联对象的实际内容统统放置在根接点中的 included 里。
有了 JSONAPI,数据解析的过程变得规范起来,节省了不必要的沟通成本。不过如果要手动构建 JSONAPI 数据还是很麻烦的,好在通过使用 Fractal 可以让实现过程相对自动化一些,上面的例子如果用 Fractal 实现大概是这个样子:
<?php
use League\Fractal\Manager;
use League\Fractal\Resource\Collection;
$articles = [
[
'id' => 1,
'title' => 'JSON API paints my bikeshed!',
'body' => 'The shortest article. Ever.',
'author' => [
'id' => 42,
'name' => 'John',
],
],
];
$manager = new Manager();
$resource = new Collection($articles, new ArticleTransformer());
$manager->parseIncludes('author');
$manager->createData($resource)->toArray();
?>如果让我选最喜爱的 PHP 工具包,Fractal 一定榜上有名,它隐藏了实现细节,让使用者完全不必了解 JSONAPI 协议即可上手。不过如果你想在自己的项目里使用的话,与直接使用 Fractal 相比,可以试试 Fractalistic ,它对 Fractal 进行了封装,使其更好用:
<?php
Fractal::create()
->collection($articles)
->transformWith(new ArticleTransformer())
->includeAuthor()
->toArray();
?>如果你是裸写 PHP 的话,那么 Fractalistic 基本就是最佳选择了,不过如果你使用了一些全栈框架的话,那么 Fractalistic 可能还不够优雅,因为它无法和框架本身已有的功能更完美的融合,以 Lavaral 为例,它本身内置了一个 API Resources 功能,在此基础上我实现了一个 JsonApiSerializer,可以和框架完美融合,代码如下:
<?php
namespace App\Http\Serializers;
use Illuminate\Http\Resources\MissingValue;
use Illuminate\Http\Resources\Json\Resource;
use Illuminate\Http\Resources\Json\ResourceCollection;
use Illuminate\Pagination\AbstractPaginator;
class JsonApiSerializer implements \JsonSerializable
{
protected $resource;
protected $resourceValue;
protected $data = [];
protected static $included = [];
public function __construct($resource, $resourceValue)
{
$this->resource = $resource;
$this->resourceValue = $resourceValue;
}
public function jsonSerialize()
{
foreach ($this->resourceValue as $key => $value) {
if ($value instanceof Resource) {
$this->serializeResource($key, $value);
} else {
$this->serializeNonResource($key, $value);
}
}
if (!$this->isRootResource()) {
return $this->data;
}
$result = [
'data' => $this->data,
];
if (static::$included) {
$result['included'] = static::$included;
}
if (!$this->resource->resource instanceof AbstractPaginator) {
return $result;
}
$paginated = $this->resource->resource->toArray();
$result['links'] = $this->links($paginated);
$result['meta'] = $this->meta($paginated);
return $result;
}
protected function serializeResource($key, $value, $type = null)
{
if ($type === null) {
$type = $key;
}
if ($value->resource instanceof MissingValue) {
return;
}
if ($value instanceof ResourceCollection) {
foreach ($value as $k => $v) {
$this->serializeResource($k, $v, $type);
}
} elseif (is_string($type)) {
$included = $value->resolve();
$data = [
'type' => $included['type'],
'id' => $included['id'],
];
if (is_int($key)) {
$this->data['relationships'][$type]['data'][] = $data;
} else {
$this->data['relationships'][$type]['data'] = $data;
}
static::$included[] = $included;
} else {
$this->data[] = $value->resolve();
}
}
protected function serializeNonResource($key, $value)
{
switch ($key) {
case 'id':
$value = (string)$value;
case 'type':
case 'links':
$this->data[$key] = $value;
break;
default:
$this->data['attributes'][$key] = $value;
}
}
protected function links($paginated)
{
return [
'first' => $paginated['first_page_url'] ?? null,
'last' => $paginated['last_page_url'] ?? null,
'prev' => $paginated['prev_page_url'] ?? null,
'next' => $paginated['next_page_url'] ?? null,
];
}
protected function meta($paginated)
{
return [
'current_page' => $paginated['current_page'] ?? null,
'from' => $paginated['from'] ?? null,
'last_page' => $paginated['last_page'] ?? null,
'per_page' => $paginated['per_page'] ?? null,
'to' => $paginated['to'] ?? null,
'total' => $paginated['total'] ?? null,
];
}
protected function isRootResource()
{
return isset($this->resource->isRoot) && $this->resource->isRoot;
}
}
?>对应的 Resource 基本还和以前一样,只是返回值改了一下:
<?php
namespace App\Http\Resources;
use App\Article;
use Illuminate\Http\Resources\Json\Resource;
use App\Http\Serializers\JsonApiSerializer;
class ArticleResource extends Resource
{
public function toArray($request)
{
$value = [
'type' => 'articles',
'id' => $this->id,
'name' => $this->name,
'author' => $this->whenLoaded('author'),
];
return new JsonApiSerializer($this, $value);
}
}
?>对应的 Controller 也和原来差不多,只是加入了一个 isRoot 属性,用来识别根:
<?php
namespace App\Http\Controllers;
use App\Article;
use App\Http\Resources\ArticleResource;
class ArticleController extends Controller
{
protected $article;
public function __construct(Article $article)
{
$this->article = $article;
}
public function show($id)
{
$article = $this->article->with('author')->findOrFail($id);
$resource = new ArticleResource($article);
$resource->isRoot = true;
return $resource;
}
}
?>整个过程没有对 Laravel 的架构进行太大的侵入,可以说是目前 Laravel 实现 JSONAPI 的最优解决方案了,有兴趣的可以研究一下 JsonApiSerializer 的实现,虽然只有一百多行代码,但是我却费了好大的力气才实现,可以说是行行皆辛苦啊。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
在Vue中设置背景图片
使用vue + less如何实现简单换肤功能
使用angular、react和vue如何实现相同的面试题组件
利用jQuery实现滚动到底部时自动加载
在Angular2.0中如何实现modal对话框
在JS中如何实现运动缓冲效果(详细教程)

json框架php 如何正确运用PHP json

PHP生成多维数组的json格式

php中将数组格式换换为json格式可以使用
json_encode函数。
示例代码如下:
<?php
//定义数组
$arr=array('city'=>array('北京','上海','广州'),'order'=>array(1,2,3));

//将数组转换为json格式
var_dump(json_encode($arr)) ;
?>
json格式效果:

json框架php 如何正确运用PHP json

如何正确运用PHP json

从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 我爱编程网

以上,就是我爱编程网小编给大家带来的json框架php 如何正确运用PHP json全部内容,希望对大家有所帮助!
与“json框架php 如何正确运用PHP json”相关推荐
php生成json框架 php如何转json
php生成json框架 php如何转json

php框架搭建方法?php框架搭建步骤:1.项目初始化首先我们在自己的web目录下创建我们的项目目录,我暂且把项目命名为hellovod,因此我的电脑目录就是:D:laragonwwwhellovod。在该目录下创建composer.json文件。2.添加入口文件初始化完毕后,我们来配置入口文件。在hellovod目录下新建一个public文件夹,并在该文件夹下创建

2023-09-13 09:33:01
php后端开发框架json 如何用php 制作json 格式api
php后端开发框架json 如何用php 制作json 格式api

php可以JSON输出json格式吗json格式与语言无关,任何语言都可以输出json格式的数据。不过js可以直接json数据转为对象,很方便。在Php5.2以后内置了json函数,json_encodejson_decode示例&lt;?php$arr=array('aa'=&gt;1,'ab'=&gt;2,'ac'=&gt;3,'d'=&gt;4);e

2023-09-23 10:40:33
php后端开发框架json数据 如何在PHP中返回Json数据
php后端开发框架json数据 如何在PHP中返回Json数据

如何在PHP中返回Json数据概述不对。返回json用的json_encode()方法没错,但是需要在头部声明格式。代码解析php返回需要用json_encode()方法来将需要转换的字符串转换成json编码格式(注意:仅仅更换文件内容,而返回的文件依然为文本格式且编码为gtk)所以,这里需要在php头部声明header('Content-Type

2023-09-24 13:31:39
php后端开发框架json数据库 php如何将结果集转json
php后端开发框架json数据库 php如何将结果集转json

php如何将结果集转jsonphp将结果集转json的方法:首先将数据库中的数据存储到一个数组;然后对这个数组进行编码;最后通过“json_encode”函数进行json编码并打印结果即可。推荐:《PHP视频教程》PHP将数据库查询内容转换为JSON格式且显示中文最近写android,开始写服务器了。最终服务器的语言就先定为PHP,因为以前写过一阵子网页,所以就先用PHP试试水

2023-10-07 02:36:58
php后台框架输出json php连接数据库后如何输出转换为json格式API,求详细解答,
php后台框架输出json php连接数据库后如何输出转换为json格式API,求详细解答,

PHP是怎么返回json格式的数据php输出JSON格式,使用json_encode函数即可例如:&lt;?phpheader('Content-type: text/json');$fruits = array (    "fruits"  =&gt; array("a" =&gt; "orange", "b" =&gt; "banana", "c" =&gt; "apple"

2023-09-18 08:57:05
php怎么能跨框架调接口 如何用php调用外部接口json数据
php怎么能跨框架调接口 如何用php调用外部接口json数据

php如何调用jsp接口php调用jsp接口的方法是使用curl_exec函数实现的。使用函数:file_get_contents($url);$URL=';param2=value2';//定义访问jsp的url//初始化curl$ch=curl_init();//设置curl返回结果curl_setopt($ch,CURLOPT_RETURNTRANSFER,

2023-10-06 17:20:21
yii框架php Yii框架如何正确使用MemCache缓存
yii框架php Yii框架如何正确使用MemCache缓存

Yii框架如何正确使用MemCache缓存具体操作如下所示:(图文教程推荐:yii)一、配置memcacheserver服务器1、下载memcached软件包,下载地址:解压,把memcached.exe放到随意一个地方,比如:d:/memcached/下(我解压到了我的wampserver的bin目录下与php目录同级)。2、windows+R快捷键输入cmd,在

2023-09-04 11:06:11
php如何修改框架宽度 php如何正确配置
php如何修改框架宽度 php如何正确配置

php如何正确配置你在本地搭建好了一个Web开发环境,通常你需要修改环境的一些设置来达到一些目的,也有可能是Web应用要求你去修改某些特定的设置,或者通过修改设置来优化网站的性能。修改Web运行环境的设置是通过修改一些配置文件来完成的,比如想要修改Apache的配置,你需要找到httpd.conf这个文件,想修改PHP的设置,一般是php.ini这个文件,MySQL的设置文件通常是my.cn

2023-09-16 02:29:20