JSON has proven to be a highly useful object serialization and messaging format.
In an attempt to harmonize the representation of
This document is an experimental work in progress.
JSON, as specified in [[!RFC4627]], is a simple language for representing
data on the Web.
JSON-LD is designed as a lightweight syntax that can be used to express
The syntax does not necessarily require applications to change their JSON, but allows one to easily add meaning by simply adding or referencing a context. The syntax is designed to not disturb already deployed systems running on JSON, but provide a smooth upgrade path from JSON to JSON-LD. Finally, the format is intended to be easy to parse, efficient to generate, and only requires a very small memory footprint in order to operate.
This document is a detailed specification for a serialization of Linked Data in JSON. The document is primarily intended for the following audiences:
This specification does not describe the programming interfaces for the JSON-LD Syntax. The specification that describes the programming interfaces for JSON-LD documents is the JSON-LD Application Programming Interface [[JSON-LD-API]].
To understand the basics in this specification you must first be familiar with JSON, which is detailed in [[!RFC4627]].
JSON [[RFC4627]] defines several terms which are used throughout this document:
@value, @list, or @set is set to null in expanded form, then the entire JSON object is ignored.
If @context is set to null, the @value, @list or @set and it has one or more keys other than @id.@id key.JSON-LD specifies a number of syntax tokens and
@context@context keyword is described in detail in the section titled
The Context.@graph@id@value@language@type@container@list@set:For the avoidance of doubt, all keys,
There are a number of ways that one may participate in the development of this specification:
A number of design goals were established before the creation of this markup language:
@context
and @id) to use the basic functionality in JSON-LD.JSON-LD is designed to ensure that
The following definition for
An illustration of a linked data graph would probably help here.
Note that the definition for
JSON-LD defines a mechanism to map JSON terms, i.e., keys and values, to IRIs. This does not mean
that JSON-LD requires every key or value to be an IRI, but rather ensures that
keys and values can be mapped to IRIs if the developer desires to transform
their data into
We will be using the following JSON markup as the example for the rest of this section:
In JSON-LD, a @ character SHOULD NOT be used
as they might be used as "") is discouraged as not all programming languages are able to handle
empty property names.
The Web uses name may
map directly to the IRI http://xmlns.com/foaf/0.1/name. This allows JSON-LD documents to be constructed
using the common JSON practice of simple name/value pairs while ensuring that the data is useful outside of the
page, API or database in which it resides. The value of a term mapping
MUST be either; 1) a simple string with the lexical form of an @id, @type, @language, or @container keyword
(all other keywords are ignored by a JSON-LD processor).
These Linked Data
Assuming that this context document can be retrieved at http://json-ld.org/contexts/person,
it can be referenced from a JSON-LD document by adding a single line. The JSON markup shown in the previous
section could be changed as follows:
The additions above transform the previous JSON document into a JSON document
with added semantics because the @context specifies how the
name, homepage, and depiction
terms map to
Contexts MAY be specified in-line. This ensures that JSON-LD documents can be processed when a JSON-LD processor does not have access to the Web.
Contexts MAY be used at any time a
If a null.
The set of contexts defined within a specific null
effectively sets the
To ensure the best possible performance, it is a best practice to
put the
If a set of
Doing this allows JSON to be unambiguously machine-readable without requiring developers to drastically change their workflow.
The example above does not use the @id @id keyword unless the data is not intended to be linked to
from other data sets.
A @id, in which case they are considered to be an
Expressing
@id or @type.@id.IRIs may be represented as an
An
IRIs can be expressed directly in the key position like so:
In the example above, the key http://xmlns.com/foaf/0.1/name is interpreted
as an :) delimiting a valid IRI scheme.
Term expansion occurs for IRIs if the value matches a
JSON keys that do not expand to an absolute IRI are ignored, or removed
in some cases, by the [[JSON-LD-API]]. However, JSON keys that do not include
a mapping in the
prefix:suffix
combination, and the prefix matches a
foaf:name above will automatically expand out to the IRI
http://xmlns.com/foaf/0.1/name. See Compact IRIs for more details.
An @id keyword:
Specifying a @id key is used to identify that object using an
If type @context for
a particular
In the example above, even though the value
http://manu.sporny.org/ is expressed as a JSON
To be able to externally reference nodes, it is important that each node has
an unambiguous identifier.
JSON-LD documents may also contain descriptions of other nodes, so it is necessary to be able to uniquely identify each node which may be externally referenced.
A @id key. The subject is the
first piece of information needed by the JSON-LD processor in order to
create the (subject, property, object) tuple, also known as a triple.
The example above would set the subject to the IRI
http://example.org/people#joebob.
A @id, in which case they are considered to be an
To ensure the best possible performance, it is a best practice
to put the @id @id is processed before they can start generating triples.
Not specifying the @id keyword first creates a memory and
complexity burden for one-pass processors.
The type of a particular subject can be specified using the
@type
In different scenarios it is important to annotate a @language key in the @context or in a
The example above would associate the ja language
code with the two
It is possible to override the default language by using the expanded form of a value:
It is also possible to override the default language or specify a plain
value by omitting the @language tag or setting it to
null when expressing the expanded value:
Please note that language associations MUST only be applied
to plain literal
To clear the default language for a subtree, @language can
be set to null in a
JSON-LD allows to associate language information with terms. See Expanded Term Definition for more details.
A JSON-LD author can express multiple values in a compact way by using
The markup shown above would result in three triples being generated, each relating the subject to an individual object, with no inherent order:
Multiple values may also be expressed using the expanded object form:
The markup shown above would generate the following triples, again with no inherent order:
As the notion of ordered collections is rather important in data
modeling, it is useful to have specific language support. In JSON-LD,
a list may be represented using the @list
This describes the use of this @container
to @list in the
List of lists are not allowed in this version of JSON-LD. If a list of lists is detected, a JSON-LD processor will throw an exception.
Similarly to @list, there exists the @set to
describe unordered sets. While its use in the body of a JSON-LD document
represents just syntactic sugar that MUST be optimized away when processing
the document, it is very helpful when used within the context of a document.
Values of terms associated with a @set- or @list-@container
are always represented in the form of an
The use of @container in the body of a JSON-LD
document, i.e., outside @context is ignored by JSON-LD processors.
JSON-LD has a number of features that provide functionality above and beyond the core functionality described above. The following sections outline the features that are specific to JSON-LD.
A value with an associated type, also known as a
@type @context section.The first example uses the @type keyword to express a typed value:
The second example uses the expanded form for specifying objects:
Both examples above would generate an object with the value of
2010-05-29T14:17:39+02:00 and the type of
http://www.w3.org/2001/XMLSchema#dateTime.
The third example uses a built-in native JSON type, a
The example above is really just a shorthand for the following:
The @type
A :) which is
similar to the CURIE Syntax
in [[RDFA-CORE]]. The foaf may be used as a short
hand for the Friend-of-a-Friend vocabulary, which is identified using
the IRI http://xmlns.com/foaf/0.1/. A developer may append
any of the FOAF foaf:name would
be expanded out to the IRI http://xmlns.com/foaf/0.1/name.
Instead of having to remember and type out the entire IRI, the developer
can instead use the prefix in their JSON-LD markup.
Terms are interpreted as //, as in
http://example.com). To generate the full :). If the _), the IRI remains unchanged. This effectively means that every term
containing a colon will be interpreted by a JSON-LD processor as an IRI.
Consider the following example:
In this example, two different prefix:suffix notation.
It's also possible to use compact IRIs within the context as shown in the following example:
Authors may choose to declare JSON-LD
In order to use an external context, an author MUST specify an @context key
within that object is substituted for the IRI within the referencing document
to have the same effect as if the value were specified inline within the
referencing document.
The following example demonstrates the use of an external context:
Authors may also import multiple contexts or a combination of external and local contexts by specifying a list of contexts:
Each context in a list will be evaluated in-order. Duplicate mappings among
the
An author may nest contexts within
In the example above, the name prefix is overridden in the
more deeply nested details structure. Note that this is
rarely a good authoring practice and is typically used when the
JSON object has legacy applications using the structure of the object.
External JSON-LD context documents MAY contain extra information located
outside of the @context key, such as
documentation about the @context value from an external JSON-LD context
document, any extra information contained outside of the
@context value MUST be discarded. It is
also RECOMMENDED that a human-readable document is served as well to
explain the correct usage of the JSON-LD context document.
Ordinary JSON documents can be transformed into JSON-LD documents by referencing
to an external JSON-LD application/json
media type.
In order to use an external context with an ordinary JSON document, an author
MUST specify an describedby link relation.
The referenced document MUST have a top-level @context subtree within that object is added to the top-level
object of the referencing document. If an array is at the top-level of the
referencing document and its items are objects, the @context
subtree is added to all array items. All extra information located outside
of the @context subtree in the referenced document MUST be
discarded.
The following example demonstrates the use of an external context with an ordinary JSON document:
JSON-LD documents served with the application/ld+json media type
MUST have all context information, including references to external contexts, within the
body of the document.
Within a
Instead of using a string representation of an IRI, the IRI MAY be
specified using an object having an @id key.
The value of the @id key MUST be either a
This allows additional information to be associated with the term. This MAY be used for Type Coercion, Sets and Lists), or to associate language information with a term as shown in the following example:
The example above would associate 忍者 with the specified default
language code ja, Ninja with the language code
en, and Nindža with the language code cs.
The value of name, Yagyū Muneyoshi wouldn't be
associated with any language code since @language was reset to
Expanded terms MAY also be defined using @id key, the expanded IRI is determined by performing expansion of the key
within the current active context. This mechanism is mainly used to associate type or language
information with a
Although it is possible to define a
JSON-LD supports the coercion of values to particular data types.
Type
Type coercion is specified within an expanded term definition
using the @type key. The values of this key represent type IRIs and MUST take the form of
@id. Specifying
@id indicates that within the body of a JSON-LD document, string values of keys coerced as
@id are to be interpreted as
@type key MAY be defined within the same context.
The example below demonstrates how a JSON-LD author can coerce values to
The example above would generate the following Turtle:
Terms may also be defined using
In this case, the @id definition is optional, but if it does exist, the
Keys in the context are treated as
Type coercion is performed using the unexpanded value of the key, which MUST exactly match a definition
in the
To be consistent with JSON-LD, in general, anywhere an IRI is expected,
normal IRI expansion rules apply (see IRIs). Within
a xsd namespace when defining
In this example, the xsd @type coercion
of the age property.
Not only
In this example, the foaf:age declares both the
@type associated with the @type associated with the foaf foaf:homepage.
In order for the foaf:homepage
will not use the { "@type": "@id" } declaration because
foaf:homepage is not the same as
http://xmlns.com/foaf/0.1/homepage. That is, a JSON-LD
processor will use direct string comparison when looking up
The only exception for using terms in the
Object
The example shows two subjects related by a property from the first subject:
An object definition, like the one used above, MAY be used as a JSON value at any point in JSON-LD.
The @graph
In this case, embedding doesn't work as each JSON-LD object references the other.
Using the @graph
@context within each object:
The @graph @graph is given a name, based on
the label of the JSON-LD object containing a @graph property,
either an
This example says that there is a http://example.org/linked-data-graph which is composed of the
statements about Manu and Gregg and a reference to another IRI, which could
make statements about Markus. Additionally, there is information about the
graph itself, which indicates a time at which this information as asserted
to be true.
At times, it becomes necessary to be able to express information without
being able to specify the subject. Typically, this type of node is called
an @id _ (underscore)
The example above would set the subject to _:foo, which can
then be used later on in the JSON-LD markup to refer back to the
JSON-LD allows all of the syntax @context,
to be aliased. This feature allows more legacy JSON content to be supported
by JSON-LD. It also allows developers to design domain-specific implementations
using only the JSON-LD
In the example above, the @id and @type
The JSON-LD API [[JSON-LD-API]] defines an method for expanding a JSON-LD document. Expansion is the process of taking a JSON-LD document and applying a context such that all IRIs, datatypes, and literal values are expanded so that the context is no longer necessary.
For example, assume the following JSON-LD input document:
Running the JSON-LD Expansion algorithm against the JSON-LD input document provided above would result in the following output:
The JSON-LD API [[JSON-LD-API]] defines a method for compacting a JSON-LD document. Compaction is the process of taking a JSON-LD document and applying a context such that the most compact form of the document is generated. JSON is typically expressed in a very compact, key-value format. That is, full IRIs are rarely used as keys. At times, a JSON-LD document may be received that is not in its most compact form. JSON-LD, via the API, provides a way to compact a JSON-LD document.
For example, assume the following JSON-LD input document:
Additionally, assume the following developer-supplied JSON-LD context:
Running the JSON-LD Compaction algorithm given the context supplied above against the JSON-LD input document provided above would result in the following output:
The compaction algorithm enables a developer to map any document into an
application-specific compacted form by first expanding the document.
While the context provided above mapped http://xmlns.com/foaf/0.1/name
to name, it could have also mapped it to any arbitrary string
provided by the developer.
JSON-LD is a specification for representing @id
and @type with the equivalent
The JSON-LD markup examples below demonstrate how JSON-LD can be used to
express semantic data marked up in other languages such as Turtle, RDFa, Microformats,
and Microdata. These sections are merely provided as proof that JSON-LD is
very flexible in what it can express across different
The following are examples of representing
The JSON-LD context has direct equivalents for the Turtle @prefix declaration:
JSON-LD has no equivalent for the Turtle @base declaration. Authors could, of course,
use a prefix definition to resolve
Both Turtle and JSON-LD allow embedding of objects, although Turtle only allows embedding of objects which use unlabeled node identifiers.
Both JSON-LD and Turtle can represent sequential lists of values.
The following example describes three people with their respective names and homepages.
An example JSON-LD implementation using a single
The following example uses a simple Microformats hCard example to express how the Microformat is represented in JSON-LD.
The representation of the hCard expresses the Microformat terms in the
url and fn
properties. Also note that the Microformat to JSON-LD processor has
generated the proper URL type for http://tantek.com/.
The microdata example below expresses book information as a microdata Work item.
Note that the JSON-LD representation of the Microdata information stays
true to the desires of the Microdata community to avoid contexts and
instead refer to items by their full
This section is included merely for standards community review and will be submitted to the Internet Engineering Steering Group if this specification becomes a W3C Recommendation.
formexpanded. If no form is
specified in an HTTP request header to an HTTP server, the server MAY
choose any form. If no form is specified in an HTTP response, the form
MUST NOT be assumed to take any particular form.application/json MIME media type.eval()
function. It is RECOMMENDED that a conforming parser does not attempt to
directly evaluate the JSON-LD serialization and instead purely parse the
input into a language-native data structure. Fragment identifiers used with application/ld+json
resources MAY identify a node in the
The editors would like to thank Mark Birbeck, who provided a great deal of the initial push behind the JSON-LD work via his work on RDFj, Dave Longley, Dave Lehn and Mike Johnson who reviewed, provided feedback, and performed several implementations of the specification, and Ian Davis, who created RDF/JSON. Thanks also to Nathan Rixham, Bradley P. Allen, Kingsley Idehen, Glenn McDonald, Alexandre Passant, Danny Ayers, Ted Thibodeau Jr., Olivier Grisel, Niklas Lindström, Markus Lanthaler, and Richard Cyganiak for their input on the specification.