Как перемещаться, перемещаться и получать доступ к объектам из файлов JSON-LD с помощью JSONLD-JAVA?

avatar
user118967
8 апреля 2018 в 06:39
1019
2
3

Мне нужно взять большой файл JSON-LD в качестве входных данных для алгоритма, который я пишу на Java. Поэтому я намерен использовать для этого JSONLD-JAVA.

На странице JSONLD-JAVA показан пример чтения файла JSON-LD, но не навигации по нему или обхода его или доступа к отдельным объектам в нем. Вместо этого он ссылается на спецификации JSON-LD и JSON-LD API для получения подробной информации о конкретных возможных операциях.

Однако спецификация JSON-LD просто определяет синтаксис и семантику JSON-LD и ничего не говорит о том, как получить к ним доступ, и, конечно же, не должна этого делать, поскольку является просто спецификацией формата. Я ожидал, что такая операция будет описана в спецификации API JSON-LD, но там описаны только операции, преобразующие весь файл JSON-LD в различные формы (компактная, расширенная, сведение и преобразование в RDF). Кажется, он не включает операции для доступа к объектам (например, доступ к парам ключ-значение объекта).

Я предполагаю, что мы должны прочитать файл JSON-LD и расширить или сгладить его, а затем получить к нему доступ как к чистому JSON. Но методы JSONLD-JAVA возвращают только экземпляры Object, поэтому мне непонятно, как я могу использовать эти объекты для получения пар ключ-значение JSON. Единственным исключением кажется метод frame, который возвращает Map, но мне не очень понятно, что такое фрейм. Спецификация JSON-LD не включает слово «фрейм», а спецификация API JSON-LD имеет очень краткое объяснение, которое, похоже, не помогает понять, как получить доступ к парам ключ-значение объекта.

Тот факт, что у меня есть только экземпляры Object из методов JSONLD-JAVA, также создает впечатление, что будет сложно использовать какую-либо библиотеку JSON для их использования, если только я не использую какую-либо библиотеку JSON, которая знает о внутреннем формате этих объектов как сформирован JSONLD-JAVA, но на странице JSONLD-Java такая библиотека не упоминается.

Я ожидал, что смогу читать файл JSON-LD, а затем программно обращаться к нему или манипулировать им в Java, а также иметь классы Java, соответствующие основным понятиям, что-то вроде JSONLDObject с методами для предоставления его ключа пары значений.

Когда я читаю эти страницы, у меня возникает ощущение, что они предназначены для людей, которые уже знают что-то, чего не знаю я. Так что, возможно, я что-то упускаю. В противном случае, есть ли руководство по использованию JSONLD-JAVA или даже просто JSONLD API для обхода объектов?

Источник

Ответы (2)

avatar
Andreas
8 апреля 2018 в 07:08
4

Если вы читаете документацию на странице 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, Number или null в зависимости от корня объект в файле).

Object jsonObject = JsonUtils.fromInputStream(inputStream);

Ключевым моментом является то, что JSONLD — это JSON, и когда вы загрузите его в память, как описано выше, вы можете перемещаться по этой структуре JSON, приведя Object по мере необходимости.

Давайте посмотрим на пример №3 из спецификации JSON-LD:

{
  "@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 
    }
  }
}

Поэтому, если вам нужно значение @id для image, вы должны сделать следующее:

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");
avatar
jschnasse
16 апреля 2018 в 08:45
2

1. Преобразование JSON-LD в красивую вложенную карту. Используйте алгоритм кадрирования. Пример: JSON-LD в обычный JSON и Как преобразовать RDF в красиво вложенный JSON с помощью 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 для JSON