繁体   English   中英

如何使用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页面显示了一个读取JSON-LD文件,而不是浏览或遍历该文件或访问其中的单个对象的示例。 相反,它参考JSON-LDJSON-LD API规范以获取有关特定可能操作的详细信息。

但是,JSON-LD规范仅定义了JSON-LD的语法和语义,没有说明如何访问它们,当然也不应该仅仅是格式的规范。 我期望在JSON-LD API规范中描述这种操作,但它仅描述将整个JSON-LD文件转换为不同形式(紧凑,扩展,展平以及转换为RDF)的操作。 它似乎不包含用于访问对象的操作(例如,访问对象的键值对)。

因此,我猜测我们应该读取JSON-LD文件并对其进行扩展或展平,然后将其作为纯JSON访问。 但是JSONLD-JAVA方法仅返回Object实例,因此我不清楚如何使用这些对象来获取JSON键值对。 唯一的例外似乎是方法frame ,该方法返回一个Map,但是对我来说不是很清楚什么是框架。 JSON-LD规范不包含“框架”一词,并且JSON-LD API规范具有非常简洁的解释,这似乎无助于理解如何访问对象的键值对。

我只有JSONLD-JAVA方法中的Object实例的事实也使得看起来似乎很难使用某些JSON库来使用它们,除非我使用一些了解JSONLD形成的这些对象的内部格式的JSON库-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));

第二条评论很有趣,所以让我为您重点介绍一下:

将文件读入一个Object (此对象的类型为ListMapStringBooleanNumbernull具体取决于文件中的根对象)。

 Object jsonObject = JsonUtils.fromInputStream(inputStream); 

关键是JSONLD是JSON ,并且当您将其像上面那样加载到内存中时,可以通过适当地转换Object来导航该JSON结构。

让我们看一下JSON-LD规范中的示例#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转换为漂亮的嵌套地图。 使用成帧算法。 示例:将JSON-LD 转换 为普通JSON,以及如何使用Java rdf4j将RDF转换为漂亮的嵌套JSON

2.访问JSON-LD。 我将JsonNodeJPointer一起使用。 在直接在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输入可能很方便。 此答案列出了一些命令行工具: JSON的XSLT等效项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM