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

时间:2018-04-08 06:39:48

标签: java json json-ld

我需要将一个大型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规范不包含单词" frame",JSON-LD API规范有一个非常简洁的解释,似乎没有帮助理解如何访问对象的密钥 - 价值对。

我只有来自JSONLD-JAVA方法的Object实例的事实也使得它看起来很难使用一些JSON库来使用它们,除非我使用一些知道这些对象的内部格式的JSON库由JSONLD-JAVA组建,但JSONLD-Java页面未提及任何此类库。

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

当我阅读上面的页面时,我感觉它们适用于那些已经知道我不知道的事情的人。所以也许我错过了一些东西。否则,是否有关于使用JSONLD-JAVA或甚至只是JSONLD API来遍历对象的教程?

2 个答案:

答案 0 :(得分:3)

如果您阅读了链接到的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(此对象的类型为ListMapStringBoolean,{ {1}}或Number,具体取决于文件中的根对象。

     
null

关键是JSONLD是 JSON ,当您将其加载到内存中时,您可以通过强制转换导航 JSON 结构Object jsonObject = JsonUtils.fromInputStream(inputStream); 视情况而定。

让我们看看JSON-LD specification

中的示例#3
Object

因此,如果您想要{ "@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 } } } 的{​​{1}}值,请执行以下操作:

@id

答案 1 :(得分:0)

1. 将JSON-LD转换为漂亮的嵌套地图。使用成帧算法。示例:JSON-LD to normal JSONHow to convert RDF to pretty nested JSON using java rdf4j

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输入可能很方便。此答案列出了一些命令行工具:XSLT equivalent for JSON