digitalbazaar/json-ld

PHP中的JSON-LD处理器和API实现。

0.4.8 2023-07-15 19:16 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:05:49 UTC


README

Build Status

介绍

此库是JSON-LD规范在PHP中的实现。

JSON,如RFC7159中所述,是一种在网络上表示对象的简单语言。链接数据是描述跨不同文档或网站内容的方法。网络资源使用IRIs进行描述,通常是可引用的实体,可以用来找到更多信息,形成一个“知识网”。JSON-LD旨在成为在JSON中表示链接数据的一种简单发布方法,并添加语义到现有的JSON中。

JSON-LD被设计成一种轻量级语法,可以用来表示链接数据。它主要旨在成为在JavaScript和其他基于Web的编程环境中表示链接数据的一种方式。它也适用于构建可互操作的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'));

商业支持

通过Digital Bazaar可提供此库的商业支持:support@digitalbazaar.com

源码

JSON-LD API的PHP实现源代码可在以下位置获取:

http://github.com/digitalbazaar/php-json-ld

测试

此库包括一个示例测试实用工具,可用于验证对处理器的更改是否保持了正确的输出。

要运行示例测试,您需要通过克隆GitHub上托管的json-ld.orgnormalization存储库来获取测试套件文件

然后运行PHPUnit test.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}