Search code examples
javajsonjson-ld

A code example of serialization JSON to JSON-LD in Java?


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:\Users\Username\input.json");
Object jsonObject = JsonUtils.fromInputStream(inputStream);
Map context = new HashMap();
JsonLdOptions options = new JsonLdOptions();

Solution

  • 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" .