A JSON-LD processor for Go
Go Makefile
Latest commit 2e54481 Mar 27, 2016 @kazarena Fix integer value processing when using JSON Decoder in UseNumber() m…
…ode.

When UseNumber() was set for JSON decoder when loading JSON-LD documents, integers were erroneously rendered as doubles when performing toRDF and normalize operations. This behavour caused differences with other implementations, like JavaScript and Python.
Permalink
Failed to load latest commit information.
examples Format examples code Mar 27, 2016
ld Fix integer value processing when using JSON Decoder in UseNumber() m… Mar 27, 2016
.gitignore Commit from local branch Apr 1, 2015
LICENSE
Makefile Add Makefile, fix a lint warning and stop building examples Aug 23, 2015
README.md Fix cope/paste error in README.md Dec 21, 2015

README.md

JSON-goLD

This library is an implementation of the JSON-LD specification in Go.

Testing & Compliance

As of April 1, 2015 all tests from the official JSON-LD test suite pass. Thanks to httptest Go package, it takes around 300ms to run the whole suite while making live connections to a mock HTTP server.

Inspiration

This implementation was heavily influenced by JSONLD-Java with some techniques borrowed from PyLD and gojsonld. Big thank you to the contributors of the forementioned libraries for figuring out implementation details of the core algorithms.

Examples

Expand

See complete code in examples/expand.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")

// expanding remote document

expanded, err := proc.Expand("http://json-ld.org/test-suite/tests/expand-0002-in.jsonld", options)
if err != nil {
    log.Println("Error when expanding JSON-LD document:", err)
    return
}

// expanding in-memory document

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

expanded, err = proc.Expand(doc, options)

Compact

See complete code in examples/compact.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")

doc := map[string]interface{}{
    "@id": "http://example.org/test#book",
    "http://example.org/vocab#contains": map[string]interface{}{
        "@id": "http://example.org/test#chapter",
    },
    "http://purl.org/dc/elements/1.1/title": "Title",
}

context := map[string]interface{}{
    "@context": map[string]interface{}{
        "dc": "http://purl.org/dc/elements/1.1/",
        "ex": "http://example.org/vocab#",
        "ex:contains": map[string]interface{}{
            "@type": "@id",
        },
    },
}

compactedDoc, err := proc.Compact(doc, context, options)

Flatten

See complete code in examples/flatten.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")

doc := map[string]interface{}{
    "@context": []interface{}{
        map[string]interface{}{
            "name": "http://xmlns.com/foaf/0.1/name",
            "homepage": map[string]interface{}{
                "@id": "http://xmlns.com/foaf/0.1/homepage",
                "@type": "@id",
            },
        },
        map[string]interface{}{
            "ical": "http://www.w3.org/2002/12/cal/ical#",
        },
    },
    "@id": "http://example.com/speakers#Alice",
    "name": "Alice",
    "homepage": "http://xkcd.com/177/",
    "ical:summary": "Alice Talk",
    "ical:location": "Lyon Convention Centre, Lyon, France",
}

flattenedDoc, err := proc.Flatten(doc, nil, options)

Frame

See complete code in examples/frame.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")

doc := map[string]interface{}{
    "@context": map[string]interface{}{
        "dc": "http://purl.org/dc/elements/1.1/",
        "ex": "http://example.org/vocab#",
        "ex:contains": map[string]interface{}{"@type": "@id"},
    },
    "@graph": []interface{}{
        map[string]interface{}{
            "@id": "http://example.org/test/#library",
            "@type": "ex:Library",
            "ex:contains": "http://example.org/test#book",
        },
        map[string]interface{}{
            "@id": "http://example.org/test#book",
            "@type": "ex:Book",
            "dc:contributor": "Writer",
            "dc:title": "My Book",
            "ex:contains": "http://example.org/test#chapter",
        },
        map[string]interface{}{
            "@id": "http://example.org/test#chapter",
            "@type": "ex:Chapter",
            "dc:description": "Fun",
            "dc:title": "Chapter One",
        },
    },
}

frame := map[string]interface{}{
    "@context": map[string]interface{}{
        "dc": "http://purl.org/dc/elements/1.1/",
        "ex": "http://example.org/vocab#",
    },
    "@type": "ex:Library",
    "ex:contains": map[string]interface{}{
        "@type": "ex:Book",
        "ex:contains": map[string]interface{}{
            "@type": "ex:Chapter",
        },
    },
}

framedDoc, err := proc.Frame(doc, frame, options)

To RDF

See complete code in examples/to_rdf.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
options.Format = "application/nquads"

// this JSON-LD document was taken from http://json-ld.org/test-suite/tests/toRdf-0028-in.jsonld
doc := map[string]interface{}{
    "@context": map[string]interface{}{
        "sec":        "http://purl.org/security#",
        "xsd":        "http://www.w3.org/2001/XMLSchema#",
        "rdf":        "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
        "dc":         "http://purl.org/dc/terms/",
        "sec:signer": map[string]interface{}{"@type": "@id"},
        "dc:created": map[string]interface{}{"@type": "xsd:dateTime"},
    },
    "@id":                "http://example.org/sig1",
    "@type":              []interface{}{"rdf:Graph", "sec:SignedGraph"},
    "dc:created":         "2011-09-23T20:21:34Z",
    "sec:signer":         "http://payswarm.example.com/i/john/keys/5",
    "sec:signatureValue": "OGQzNGVkMzVm4NTIyZTkZDYMmMzQzNmExMgoYzI43Q3ODIyOWM32NjI=",
    "@graph": map[string]interface{}{
        "@id":      "http://example.org/fact1",
        "dc:title": "Hello World!",
    },
}
triples, err := proc.ToRDF(doc, options)

From RDF

See complete code in examples/from_rdf.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")

triples := `
    <http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> .
    <http://example.com/Subj1> <http://example.com/prop1> <http://example.com/Obj1> .
    <http://example.com/Subj1> <http://example.com/prop2> "Plain" .
    <http://example.com/Subj1> <http://example.com/prop2> "2012-05-12"^^<http://www.w3.org/2001/XMLSchema#date> .
    <http://example.com/Subj1> <http://example.com/prop2> "English"@en .
`

doc, err := proc.FromRDF(triples, options)

Normalize

See complete code in examples/normalize.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
options.Format = "application/nquads"

doc := map[string]interface{}{
    "@context": map[string]interface{}{
        "ex": "http://example.org/vocab#",
    },
    "@id": "http://example.org/test#example",
    "@type": "ex:Foo",
    "ex:embed": map[string]interface{}{
        "@type": "ex:Bar",
    },
}

normalizedTriples, err := proc.Normalize(doc, options)