zohurul / json-api-parser
json:api 响应解析器,遵循 https://jsonapi.fullstack.org.cn/
v1.0.1
2019-11-07 10:09 UTC
Requires
- php: >=7.1.3
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-09 11:37:06 UTC
README
这是一个用于解析 {JSON:API} 响应的 PHP 包,或者说是一个反序列化器。
💡 在开始之前请注意,这个库仅适用于 {JSON:API} 资源,请访问 https://jsonapi.fullstack.org.cn 了解更多详情。
安装
composer require zohurul/json-api-parser
入门
您可以使用 Parser 类来解析 json 字符串。
use JsonApiParser/Parser; $parser =new Parser($jsonString);
尝试解析一个 json 字符串
使用 ParserException 来捕获所有异常
use JsonApiParser\Parser; use JsonApiParser\Exceptions\ParserException; try{ $parser = new Parser($jsonString); }catch(ParserException $e){ echo $e->getMessage(); }
一个非常复杂的示例
假设我们收到了来自客户端的以下 json 响应
{ "jsonapi": { "version": "1.0" }, "meta": { "total": 6, "current": 2 }, "links": { "self": "http://example.com/articles", "next": "http://example.com/articles?page[offset]=2", "last": "http://example.com/articles?page[offset]=10" }, "data": [ { "type": "articles", "id": "1", "attributes": { "title": "JSON:API paints my bikeshed!" }, "relationships": { "author": { "links": { "self": "http://example.com/articles/1/relationships/author", "related": "http://example.com/articles/1/author" }, "data": { "type": "people", "id": "9" } }, "comments": { "links": { "self": "http://example.com/articles/1/relationships/comments", "related": "http://example.com/articles/1/comments" }, "data": [ { "type": "comments", "id": "5" }, { "type": "comments", "id": "12" } ] } }, "links": { "self": "http://example.com/articles/1" } }, { "type": "articles", "id": "2", "attributes": { "title": "JSON:API paints my bikeshed 2!" }, "relationships": { "author": { "links": { "self": "http://example.com/articles/1/relationships/author", "related": "http://example.com/articles/1/author" }, "data": { "type": "people", "id": "19" } }, "comments": { "links": { "self": "http://example.com/articles/1/relationships/comments", "related": "http://example.com/articles/1/comments" }, "data": { "type": "comments", "id": "13" } } }, "links": { "self": "http://example.com/articles/1" } } ], "included": [ { "type": "people", "id": "9", "attributes": { "firstName": "Dan", "lastName": "Gebhardt", "twitter": "dgeb" }, "links": { "self": "http://example.com/people/9" } }, { "type": "people", "id": "2", "attributes": { "firstName": "Dan2", "lastName": "Gebhardt2", "twitter": "dgeb2" }, "links": { "self": "http://example.com/people/2" } }, { "type": "comments", "id": "5", "attributes": { "body": "First!" }, "relationships": { "author": { "data": { "type": "people", "id": "2" } } }, "links": { "self": "http://example.com/comments/5" } }, { "type": "comments", "id": "12", "attributes": { "body": "I like XML better" }, "relationships": { "author": { "data": { "type": "people", "id": "9" } } }, "links": { "self": "http://example.com/comments/12" } }, { "type": "comments", "id": "13", "attributes": { "body": "I like XML better" }, "relationships": { "author": { "data": { "type": "people", "id": "9" } } }, "links": { "self": "http://example.com/comments/12" } }, { "type": "comments", "id": "17", "attributes": { "body": "I like XML better" }, "relationships": { "author": { "data": { "type": "people", "id": "9" } } }, "links": { "self": "http://example.com/comments/12" } } ] }
并且我们希望通过嵌套循环打印所有信息
use JsonApiParser\Parser; $parser = new Parser($jsonString); //To print a version echo $parser->version(); //Whole meta object print_r($parser->meta()); //Single meta object echo $parser->meta()->total; //To get whole links object print_r($parser->links()); //To get a single link echo $parser->links()->self; //prepare included relational data $included = $parser->included(); //main data block $articles = $parser->data(); foreach ($articles as $article) { //print the article type echo $article->type(); //print the article id echo $article->id(); //To check if any specific key exist var_dump($item->contain('attributes', 'title')); //to print an item attribute echo $item->attribute()->title; //Fetch a relationship object by relationship name $comments = $item->relationships("comments"); //To print all the comments foreach ($comments->data() as $comment) { //print the id echo $comment->id(); //Fetch the relational data from included $commentItem = $comment->comments(); //print it's attribute echo $commentItem->attribute()->body; $authors = $commentItem->relationships("author"); foreach($authors->data() as $author){ //author id echo $author->id(); //to print the author attribute item echo $author->people()->attribute()->twitter; } } }