如何使用 JSONLD-JAVA 遍历、导航和访问 JSON-LD 文件中的对象?

How to traverse, navigate and access objects from a JSON-LD files with JSONLD-JAVA?

我需要将一个大的 JSON-LD 文件作为我在 Java 中编写的算法的输入。因此,我打算为此使用 JSONLD-JAVA。

JSONLD-JAVA page shows an example for reading a JSON-LD file, but not for navigating or traversing it, or accessing individual objects in it. Instead, it refers to the JSON-LD and JSON-LD API 规范以获取有关特定可能操作的详细信息。

然而,JSON-LD 规范只是简单地定义了 JSON-LD 的语法和语义,并没有说明如何访问它们,当然也不应该,只是格式的规范。我期待在 JSON-LD API 规范中描述这种操作,但它只描述了将整个 JSON-LD 文件转换为不同形式的操作(紧凑,扩展、展平和转换为 RDF)。好像没有包含访问对象的操作(比如访问对象的键值对)

所以我猜我们应该读取 JSON-LD 文件并展开或展平它,然后以纯 JSON 的形式访问它。但是 JSONLD-JAVA 方法只有 Object 的 return 个实例,所以我不清楚如何使用这些对象来获取 JSON 键-值对。唯一的例外似乎是方法 frame,它 return 是一个 Map,但我不是很清楚什么是框架。 JSON-LD 规范不包括单词 "frame",并且 JSON-LD API 规范有一个非常简洁的解释,似乎无助于理解如何访问对象的键值对。

我只有 JSONLD-JAVA 方法中的 Object 实例这一事实也使它看起来很难使用某些 JSON 库来使用它们,除非我使用了一些 JSON 库,它知道由 JSONLD-JAVA 形成的这些对象的内部格式,但是 JSONLD-Java 的页面没有提到任何这样的图书馆。

我期望能够读取 JSON-LD 文件,然后在 Java 中以编程方式访问或操作它,并且 Java 类对应于主要概念,类似于 JSONLDObject 以及提供其键值对的方法。

当我阅读以上几页时,我觉得它们是为那些已经知道一些我不知道的人准备的。所以也许我错过了什么。否则,是否有关于使用 JSONLD-JAVA 甚至只是 JSONLD API 来遍历对象的教程?

如果您阅读链接到的 JSONLD-JAVA 页面上的文档,它以 评论 示例开头:

// Open a valid json(-ld) input file
InputStream inputStream = new FileInputStream("input.json");
// Read the file into an Object (The type of this object will be a List, Map, String, Boolean,
// Number or null depending on the root object in the file).
Object jsonObject = JsonUtils.fromInputStream(inputStream);
// Create a context JSON map containing prefixes and definitions
Map context = new HashMap();
// Customise context...
// Create an instance of JsonLdOptions with the standard JSON-LD options
JsonLdOptions options = new JsonLdOptions();
// Customise options...
// Call whichever JSONLD function you want! (e.g. compact)
Object compact = JsonLdProcessor.compact(jsonObject, context, options);
// Print out the result (or don't, it's your call!)
System.out.println(JsonUtils.toPrettyString(compact));

第二个评论很有意思,我给大家划重点:

Read the file into an Object (The type of this object will be a List, Map, String, Boolean, Number or null depending on the root object in the file).

Object jsonObject = JsonUtils.fromInputStream(inputStream);

关键是 JSONLD 是 JSON,当你像上面那样将它加载到内存中时,你可以导航它JSON 结构,通过适当地转换 Object

让我们看一下 JSON-LD specification:

中的示例 #3
{
  "@context":
  {
    "name": "http://schema.org/name",  // ← This means that 'name' is shorthand for 'http://schema.org/name' 
    "image": {
      "@id": "http://schema.org/image",  // ← This means that 'image' is shorthand for 'http://schema.org/image' 
      "@type": "@id"  // ← This means that a string value associated with 'image' should be interpreted as an identifier that is an IRI 
    },
    "homepage": {
      "@id": "http://schema.org/url",  // ← This means that 'homepage' is shorthand for 'http://schema.org/url' 
      "@type": "@id"  // ← This means that a string value associated with 'homepage' should be interpreted as an identifier that is an IRI 
    }
  }
}

因此,如果您想要 image@id 值,您可以这样做:

Map<String, Object> root = (Map) jsonObject;
Map<String, Object> context = (Map) root.get("@context");
Map<String, Object> image = (Map) root.get("image");
String imageId = (String) image.get("@id");

1. 将 JSON-LD 转换为漂亮的嵌套地图。使用分帧算法。示例:

2. 访问 JSON-LD。我会使用 JsonNode together with JPointer。 对小而简单的文件直接操作Map<String,Object>也行。对于 JsonPointer,您可以使用 Jackson JsonNode.at().

ObjectMapper mapper = new ObjectMapper();
JsonNode json = mapper.readValue(in, JsonNode.class);
String id = json.at("/@id").getText();

3.预处理。在某些情况下,预处理 JSON 输入可能很方便。这个答案列出了一些命令行工具:XSLT equivalent for JSON