我需要将一个大型JSON-LD文件作为我用Java编写的算法的输入。因此,我打算使用JSONLD-JAVA。
JSONLD-JAVA页面显示了一个用于读取JSON-LD文件的示例,但不是用于导航或遍历它,也不是用于访问其中的单个对象。相反,它指的是JSON-LD和JSON-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来遍历对象的教程?
答案 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
(此对象的类型为List
,Map
,String
,Boolean
,{ {1}}或Number
,具体取决于文件中的根对象。null
关键是JSONLD是 JSON ,当您将其加载到内存中时,您可以通过强制转换导航 JSON 结构Object jsonObject = JsonUtils.fromInputStream(inputStream);
视情况而定。
让我们看看JSON-LD specification:
中的示例#3Object
因此,如果您想要{
"@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 JSON 和How to convert RDF to pretty nested JSON using java rdf4j
2. 访问JSON-LD。我会将JsonNode与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