friendica / json-ld
PHP中的JSON-LD处理器和API实现。
Requires
- php: >=5.4.0
- ext-json: *
This package is not auto-updated.
Last update: 2024-09-23 23:39:13 UTC
README
简介
根据RFC7159,JSON是一种简单用于在网络上表示对象的编程语言。链接数据是一种描述跨不同文档或网站内容的方法。Web资源使用IRIs进行描述,通常是可解析的实体,可用于查找更多信息,创建“知识网”。JSON-LD旨在成为在JSON中表示链接数据的一种简单发布方法,同时也用于为现有的JSON添加语义。
JSON-LD被设计为一种轻量级语法,可用于表达链接数据。其主要目的是在JavaScript和其他基于Web的编程环境中表达链接数据。它也适用于构建可互操作的网络服务以及将链接数据存储在基于JSON的文档存储引擎中。它是实用的,并且设计得尽可能简单,利用今天大量使用的JSON解析器和现有代码。它被设计为能够表达键值对、RDF数据、RDFa数据、Microformats数据和Microdata。也就是说,它支持今天所有主要的基于Web的结构化数据模型。
该语法不需要许多应用程序更改其JSON,但通过添加上下文来轻松地添加意义,这种方式要么在带内,要么在带外。该语法设计为不会干扰已经在JSON上运行的已部署系统,但提供从JSON到具有添加语义的JSON的平滑迁移路径。最后,该格式旨在快速解析,快速生成,基于流和基于文档的处理兼容,并且为了操作需要非常小的内存占用。
快速示例
$doc = (object)array(
"http://schema.org/name" => "Manu Sporny",
"http://schema.org/url" => (object)array("@id" => "http://manu.sporny.org/"),
"http://schema.org/image" => (object)array("@id" => "http://manu.sporny.org/images/manu.png")
);
$context = (object)array(
"name" => "http://schema.org/name",
"homepage" => (object)array("@id" => "http://schema.org/url", "@type" => "@id"),
"image" => (object)array("@id" => "http://schema.org/image", "@type" => "@id")
);
// compact a document according to a particular context
// see: http://json-ld.org/spec/latest/json-ld/#compacted-document-form
$compacted = jsonld_compact($doc, $context);
echo json_encode($compacted, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
/* Output:
{
"@context": {...},
"image": "http://manu.sporny.org/images/manu.png",
"homepage": "http://manu.sporny.org/",
"name": "Manu Sporny"
}
*/
// compact using URLs
jsonld_compact('http://example.org/doc', 'http://example.org/context');
// expand a document, removing its context
// see: http://json-ld.org/spec/latest/json-ld/#expanded-document-form
$expanded = jsonld_expand($compacted) {
echo json_encode($expanded, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
/* Output:
{
"http://schema.org/image": [{"@id": "http://manu.sporny.org/images/manu.png"}],
"http://schema.org/name": [{"@value": "Manu Sporny"}],
"http://schema.org/url": [{"@id": "http://manu.sporny.org/"}]
}
*/
// expand using URLs
jsonld_expand('http://example.org/doc');
// flatten a document
// see: http://json-ld.org/spec/latest/json-ld/#flattened-document-form
$flattened = jsonld_flatten($doc);
// all deep-level trees flattened to the top-level
// frame a document
// see: http://json-ld.org/spec/latest/json-ld-framing/#introduction
$framed = jsonld_frame($doc, $frame);
// document transformed into a particular tree structure per the given frame
// normalize a document using the RDF Dataset Normalization Algorithm
// (URDNA2015), see: http://json-ld.github.io/normalization/spec/
$normalized = jsonld_normalize(
$doc, array('algorithm' => 'URDNA2015', 'format' => 'application/nquads'));
// normalized is a string that is a canonical representation of the document
// that can be used for hashing, comparison, etc.
// force HTTPS-only context loading:
// use built-in secure document loader
jsonld_set_document_loader('jsonld_default_secure_document_loader');
// set a default custom document loader
jsonld_set_document_loader('my_custom_doc_loader');
// a custom loader that demonstrates using a simple in-memory mock for
// certain contexts before falling back to the default loader
// note: if you want to set this loader as the new default, you'll need to
// store the previous default in another variable first and access that inside
// the loader
global $mocks;
$mocks = array('http://example.com/mycontext' => (object)array(
'hombre' => 'http://schema.org/name'));
function mock_load($url) {
global $jsonld_default_load_document, $mocks;
if(isset($mocks[$url])) {
// return a "RemoteDocument", it has these three properties:
return (object)array(
'contextUrl' => null,
'document' => $mocks[$url],
'documentUrl' => $url);
}
// use default loader
return call_user_func($jsonld_default_load_document, $url);
}
// use the mock loader for just this call, witout modifying the default one
$compacted = jsonld_compact($foo, 'http://example.com/mycontext', array(
'documentLoader' => 'mock_load'));
// a custom loader that uses a simplistic in-memory cache (no invalidation)
global $cache;
$cache = array();
function cache_load($url) {
global $jsonld_default_load_document, $cache;
if(isset($cache[$url])) {
return $cache[$url];
}
// use default loader
$doc = call_user_func($jsonld_default_load_document, $url);
$cache[$url] = $doc;
return $doc;
}
// use the cache loader for just this call, witout modifying the default one
$compacted = jsonld_compact($foo, 'http://schema.org', array(
'documentLoader' => 'cache_load'));
源代码
JSON-LD API的PHP实现的源代码可在以下地址获取
https://git.friendi.ca/friendica/php-json-ld
测试
此库包括一个示例测试实用程序,可用于验证对处理器的更改是否保持正确的输出。
要运行示例测试,您需要通过克隆GitHub上托管的json-ld.org
和normalization
存储库来获取测试套件文件
然后运行PHPUnit测试.php应用程序,将其指向包含测试的目录
phpunit --group json-ld.org test.php -d {PATH_TO_JSON_LD_ORG/test-suite}
phpunit --group normalization test.php -d {PATH_TO_NORMALIZATION/tests}