跳到主要内容

扁平化访问:JSON-LD To 扁平化形式 — Numio

使用 jsonld.flatten 扁平化 JSON-LD 文档:包括嵌套节点在内的每个节点都成为 @graph 中的顶层条目,嵌套对象被替换为 {"@id"} 引用。没有名称的节点会得到 _:b0 这样的空白节点 id。

将深度嵌套的 JSON-LD 转为扁平的节点列表,便于按 @id 建索引或载入存储。

JSON-LD

Context

Flattened

适用场景

  • 将深度嵌套的 JSON-LD 转为扁平的节点列表,便于按 @id 建索引或载入存储。
  • 找出哪些嵌套对象没有 @id,它们会以 _:b 空白节点的形式出现。

使用方法

  1. 将文档粘贴到 JSON-LD 编辑器。
  2. 在 Context 编辑器中填入用于压缩结果的 context,例如 {"@context": {"@vocab": "http://schema.org/"}}。
  3. 查看 @graph 数组,其中每个节点只列出一次,并按 @id 排序。

JSON-LD + context

// JSON-LD editor
{
  "@context": {"@vocab": "http://schema.org/"},
  "@id": "http://example.org/order/7",
  "@type": "Order",
  "customer": {"name": "Jane Doe"},
  "orderedItem": [
    {"@id": "http://example.org/product/42", "name": "Lamp"}
  ]
}

// Context editor
{"@context": {"@vocab": "http://schema.org/"}}

扁平化后的 JSON-LD

{
  "@context": {
    "@vocab": "http://schema.org/"
  },
  "@graph": [
    {
      "@id": "_:b0",
      "name": "Jane Doe"
    },
    {
      "@id": "http://example.org/order/7",
      "@type": "Order",
      "customer": {
        "@id": "_:b0"
      },
      "orderedItem": {
        "@id": "http://example.org/product/42"
      }
    },
    {
      "@id": "http://example.org/product/42",
      "name": "Lamp"
    }
  ]
}

功能与限制

Context 编辑器为必填项,且必须包含有效的 JSON;结果会用它进行压缩。

空白节点 id(_:b0、_:b1 等)在处理过程中分配,不是稳定的标识符。

使用 jsonld.js 在浏览器中运行。两个编辑器中的远程 context 都由浏览器获取。下载失败时,页面会显示包含该 context URL 的错误。

FAQ

嵌套对象会怎样?

每个嵌套对象都成为 @graph 中独立的条目,父节点只保留引用,例如 "customer": {"@id": "_:b0"}。

为什么单元素数组显示为对象?

因为结果经过压缩,只有一个值的属性(上例中的 orderedItem)会去掉数组直接写出。

同一个节点出现两次会合并吗?

会。具有相同 @id 的节点会合并为一个条目,包含它们的所有属性。

规范与参考资料