2017-02-03 18 views
0

Я пытаюсь сериализовать модель как JSON-LD и хранить ее в строковой переменной с использованием RDF4J.Строка сериализации JSON-LD без отступов, пробелов или разрывов строк в RDF4J/Sesame

Моего код выглядит следующим образом:

public void storeAsString(Model model) { 
    StringWriter stringWriter = new StringWriter(); 
    RDFWriter rdfWriter = Rio.createWriter(RDFFormat.JSONLD, stringWriter); 

    rdfWriter.getWriterConfig().set(JSONLDSettings.JSONLD_MODE, JSONLDMode.COMPACT); 
    rdfWriter.getWriterConfig().set(JSONLDSettings.OPTIMIZE, true); 

    Rio.write(model, rdfWriter); 
    String output = stringWriter.toString(); 
} 

Это дает мне строку JSON-LD, но без каких-либо отступов, пробелов и разрывов строк так, что System.out.println(output) не является читаемым человеком. Это выглядит следующим образом:

{"@context":"http://schema.org/","type":"Person","jobTitle":"Professor","name":"Jane Doe","telephone":"(425) 123-4567","url":"http://www.janedoe.com"} 

В Apache Jena есть RDFFormat называется JSONLD_PRETTY, который дал бы мне нужный формат вывода. Он выглядит примерно так:

{ 
    "@context": "http://schema.org/", 
    "@graph": [ 
    { 
     "id": "_:b0", 
     "type": "Person", 
     "jobTitle": "Professor", 
     "name": "Jane Doe", 
     "telephone": "(425) 123-4567", 
     "url": "http://www.janedoe.com" 
    } 
    ] 
} 

Возможно ли это также с Eclipse RDF4J?

Спасибо заранее!

Edit: Когда я пытаюсь сохранить строку JSON-LD с MongoDB он бросает эту ошибку: Invalid BSON field name. Это проблема с сериализацией или с моей встроенной моделью?

Редакция № 2: Приведенный выше код работает безупречно с форматом черепахи, например. У меня эта проблема только с JSON-LD и RDFJSON.

ответ

1

Это возможно, установив опцию BasicWriterSettings.PRETTY_PRINT в true:

rdfWriter.getWriterConfig().set(BasicWriterSettings.PRETTY_PRINT, true); 

Никакая идея о проблеме MongoDB, кажется, что это должен быть отдельный вопрос.

+0

Прежде всего, спасибо! Это настройка, которую я искал. Но есть новая проблема: 'JSONLDMode.FLATTEN', а также' JSONLDMode.EXPAND' не доставляет хорошо сформированный JSON. Первым символом в строке является '[', а не '{'. Возможно, это причина, по которой он не может быть сохранен в MongoDB. Кроме того, он не использует пространства имен, которые я объявил, поэтому нет объекта @ @ context. Но если я использую 'JSONLDMode.COMPACT', все работает отлично. Вы знаете, что может вызвать такое поведение? – phly

+0

Похоже, что он превращает его в массив с одним элементом. Это на самом деле хорошо сформированный JSON, но, по общему признанию, это немного странно. Я не сразу понимаю, почему это происходит - я предлагаю вам запустить [запрос поддержки] (https://github.com/eclipse/rdf4j/issues) с проектом RDF4J. –