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; } } }