It is inspired by the Resource Description Framework (RDF)
and its Subject / Predicate / Object "Triples". It's however
not "flat", but represents "Blank Nodes" as "Unlabeled Nested"
sub-structures, which makes it resemble regular ProtoBuf / JSON / YAML.
This is also very close to (essentially really just a Protocol Buffer
representation of) the "Expanded Term Definition" of the W3C's JSON-LD
format.
This obviously also looks a bit similar to Proto's Struct
(see google/protobuf/struct.proto), with additional explicit Links.
Cap’n Proto's interface types, which are passed by reference instead of value
over its RPC protocol, also somewhat resemble the explicit links used here.
The IRI is often only set on the "top outer most", and may well be unset for things "contained" in other things (RDF calls this "blank nodes"). It's not even mandatory required for the "top outer most" one either. (TODO Why do we even need this?! Why not just use an https://schema.org/identifier field/attribute?)
Key string is an IRI (of a "property"). Nota Bene: This is never a “name” (or even a “label”), but really an IRI. In theory such a Property IRI could be unique to only this single Thing; more typically, it is shared among things of the same type. Crucially though, it could also be an IRI of a property that is common among attributes of different types! Classic examples are e.g. https://schema.org/name (rdfs:label 🏷️) or rdf:type.
Value of the literal. This is "encoded" by the datatype, below. (RDF calls this the "label", but to us that sounds wrong, because it evokes "something to show human users" too much.)