I need to convert a some mass of data represented in the form of JSON
to JSON-LD
. I want to do this with this JSON-LD
Java implementation, but I don’t understand, what should I do.
I watched several tutorials and read something about JSON-LD
on the Internet, but do not understand the simplest thing: how do I convert JSON
to JSON-LD
?
For example, I have this code in JSON:
{ "name" : "Andreas", "age" : 20, "profession" : "student", "personalWebsite" : "example.com" }
What should I do now? Something like context.add("example.com")
?
InputStream inputStream = new FileInputStream("C:UsersUsernameinput.json"); Object jsonObject = JsonUtils.fromInputStream(inputStream); Map context = new HashMap(); JsonLdOptions options = new JsonLdOptions();
Answer
Add a ‘@context’ entry to your data.
{ "name" : "Andreas", "age" : 20, "profession" : "student", "personalWebsite" : "example.com", "@context":"http://schema.org/" }
Your JSON-LD Processor will do the rest (since version 0.9)
As test you can convert your json to rdf.
package overflow.stack2449461; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.StringWriter; import java.util.Collection; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; import org.eclipse.rdf4j.rio.Rio; import org.eclipse.rdf4j.rio.helpers.StatementCollector; public class Test { @org.junit.Test public void testForYourCode() { String data = "{"name" : "Andreas","age" : 20,"profession" : "student", "personalWebsite" : "example.com","@context": "http://schema.org/"}"; try (InputStream in = new ByteArrayInputStream(data.getBytes("utf-8"))) { String dataAsRdf = readRdfToString(in, RDFFormat.JSONLD, RDFFormat.NTRIPLES, ""); System.out.println(dataAsRdf); } catch (Exception e) { throw new RuntimeException(e); } } /** * @param in * a rdf input stream * @param inf * the rdf format of the input stream * @param outf * the output format * @param baseUrl * usually the url of the resource * @return a string representation */ public static String readRdfToString(InputStream in, RDFFormat inf, RDFFormat outf, String baseUrl) { Collection<Statement> myGraph = null; myGraph = readRdfToGraph(in, inf, baseUrl); return graphToString(myGraph, outf); } /** * @param inputStream * an Input stream containing rdf data * @param inf * the rdf format * @param baseUrl * see sesame docu * @return a Graph representing the rdf in the input stream */ public static Collection<Statement> readRdfToGraph(final InputStream inputStream, final RDFFormat inf, final String baseUrl) { try { final RDFParser rdfParser = Rio.createParser(inf); final StatementCollector collector = new StatementCollector(); rdfParser.setRDFHandler(collector); rdfParser.parse(inputStream, baseUrl); return collector.getStatements(); } catch (final Exception e) { throw new RuntimeException(e); } } /** * Transforms a graph to a string. * * @param myGraph * a sesame rdf graph * @param outf * the expected output format * @return a rdf string */ public static String graphToString(Collection<Statement> myGraph, RDFFormat outf) { StringWriter out = new StringWriter(); RDFWriter writer = Rio.createWriter(outf, out); try { writer.startRDF(); for (Statement st : myGraph) { writer.handleStatement(st); } writer.endRDF(); } catch (RDFHandlerException e) { throw new RuntimeException(e); } return out.getBuffer().toString(); } }
With pom.xml
<dependency> <groupId>org.eclipse.rdf4j</groupId> <artifactId>rdf4j-runtime</artifactId> <version>2.2</version> <type>pom</type> </dependency> <dependency> <groupId>com.github.jsonld-java</groupId> <artifactId>jsonld-java</artifactId> <version>0.10.0</version> </dependency>
It will print your json string as rdf NTRIPLES
_:b0 <http://schema.org/age> "20"^^<http://www.w3.org/2001/XMLSchema#integer> . _:b0 <http://schema.org/name> "Andreas" . _:b0 <http://schema.org/personalWebsite> "example.com" . _:b0 <http://schema.org/profession> "student" .