JSON-LD Framing能否控制实体顺序及实现实体嵌套分组?
JSON-LD Framing 相关问题与解答
问题描述
1. 实体顺序控制需求
给定JSON-LD输入:
{"@context": "https://www.w3.org/ns/activitystreams","@type": "Create","actor": {"@type": "Person","@id": "acct:sally@example.org","name": "Sally"},"object": {"@type": "Note","content": "This is a simple note"},"published": "2015-01-25T12:34:56Z"}
期望输出确保Person实体在Create类型的Activity实体之后:
{"@context": "https://www.w3.org/ns/activitystreams","@graph": [{"type": "Create","actor": "acct:sally@example.org","object": {"type": "Note","content": "This is a simple note"},"published": "2015-01-25T12:34:56Z"},{"id": "acct:sally@example.org","type": "Person","name": "Sally"}]}
当前使用的Framing配置能实现拆分实体的效果,但无法保证顺序:
{"@context": "https://www.w3.org/ns/activitystreams","type": ["Person", "Create"],"actor": {"@embed" : "@never","@omitDefault": true}}
2. 实体嵌套分组需求
希望将Person实体嵌套在actors键下,实现类似如下输出(注:原期望输出的@graph结构不符合JSON-LD规范,需注意语法正确性):
{"@context": "https://www.w3.org/ns/activitystreams","@graph": [{"type": "Create","actor": "acct:sally@example.org","object": {"type": "Note","content": "This is a simple note"},"published": "2015-01-25T12:34:56Z"},"actors": [{"id": "acct:sally@example.org","type": "Person","name": "Sally"}]}
解答
一、实体顺序控制
JSON-LD Framing本身不直接保证@graph数组内的实体顺序,因为JSON-LD规范中,图节点默认是无序集合。但可以通过以下方式间接实现预期顺序:
- 分两次执行Framing:先针对
Create类型实体配置Framing,得到Activity节点;再针对Person类型实体配置Framing,得到Person节点;最后手动合并两个结果到@graph数组中,按需求顺序排列。 - 使用支持自定义排序的处理器:部分JSON-LD处理器提供扩展参数,允许基于
@type或其他属性指定排序优先级,以此强制实体输出顺序。
你当前的Framing配置中,type数组的顺序["Person", "Create"]无法决定输出顺序,因为处理器通常按内部索引或遍历逻辑排序,不能依赖这个配置来保证顺序。
二、@nest实现实体嵌套分组
可以通过@nest结合Framing配置实现实体嵌套,但需要修正原期望输出的结构问题——@graph必须是节点数组,不能混合键值对。如果要将Person实体嵌套到顶层actors属性下,可使用如下Framing配置:
{ "@context": "https://www.w3.org/ns/activitystreams", "@type": "Create", "actor": {"@embed": "@never"}, "@nest": { "actors": { "@type": "Person", "@embed": "@always" } } }
执行后会得到类似如下的合规结构:
{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Create", "actor": "acct:sally@example.org", "object": {"type": "Note", "content": "This is a simple note"}, "published": "2015-01-25T12:34:56Z", "actors": [{"id": "acct:sally@example.org", "type": "Person", "name": "Sally"}] }
注意:不同JSON-LD处理器对@nest的支持细节可能有差异,需结合使用的处理器文档调整配置。
内容的提问来源于stack exchange,提问作者ThomasFrancart
相关产品推荐
相关产品推荐

