Description
I've been working on a generic browser concept based on JSON Reference. It's still very early stages, but I think the model I came up with is a candidate for a solution to the issues JSON Schema has with $id
. I've been meaning to share this for a while, but have been hesitating due to uncertainty about how to present it. I've finally decided that getting something out there is better than nothing, so I'm presenting this brief overview and I'll let any questions drive any discussion.
I've found this model easy and efficient to implement. It has strong parallels to existing web constructs. It simplifies the concepts without loosing anything of value.
One of the goals of this model is to fully decouple JSON Pointer, JSON Reference, and JSON Schema. Each can be implemented independently of one another. I wrote a JSON Schema-ish validation proof of concept that builds on JSON Reference (rather than JSON). This implementation has full support for
$ref
/$id
without dedicating a single line of code to supporting it.
JSON Reference for JSON Schema Implementors
The features of JSON Reference are very similar to the features of $ref
and
$id
in JSON Schema. However, the concepts are slightly different and the
keywords are slightly more constrained (in a good way) than their JSON Schema
counterparts.
Documents vs Values
All JSON Reference documents have a "value". The fragment part of the document's
URI identifies the portion of the document that is considered the "value" of the
document.
If the fragment is empty, the value of the document is the whole document.
If the fragment starts with a /
the fragment is interpreted as a JSON Pointer
and the value of the document is the document resolved against the JSON Pointer.
If the fragment is not a JSON Pointer, then it's an anchor fragment. The
$anchor
keyword provides a label that marks a portion of the document. Given
an anchor fragment, the value of the document is the portion of the document
identified by an $anchor
keyword that matches the anchor fragment.
The value of a document whose URI fragment does not point to a valid part of the
document is undefined. Implementations must not cross document boundaries in
attempt to resolve a fragment.
$ref
indicates an embedded document
$ref
indicates a document to be embedded. It's analogous to an <iframe/>
in
an HTML document. Even $ref
s that point to the current document are embedded
documents. Notice that the entire document is embedded, not just the value of
the document. However, a user agent that encounters an embedded document should
use the value of the document. It's necessary to embed the entire document in
order to properly handle any $ref
within the embedded document.
$id
is an embedded $ref
An $id
indicates an inlined $ref
. This is similar to using the HTTP/2 push
feature to send the document identified by the src
attribute of an <iframe>
.
It's just a network optimization for a $ref
. This means that unlike JSON
Schema, an $id
can have a fragment and that fragment is meaningful.
$anchor
is not an embedded document
$anchor
provides a way to have a path-independent way to identify a
document's value without creating a document boundary.