O esquema a seguir é usado $id
para fornecer uma maneira independente de posição de identificar os dois subesquemas:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "http://www.example.com/schema",
"$defs": {
"schema1": {
"$id": "insect",
"type": "string",
"enum": ["beetle", "grasshopper"]
},
"schema2": {
"$id": "fruit",
"type": "string",
"enum": ["orange", "apple"]
}
},
"$ref": "insect"
}
E esse esquema restringe as instâncias exatamente no mesmo grau, usando $anchor
:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "http://www.example.com/schema",
"$defs": {
"schema1": {
"$anchor": "insect",
"type": "string",
"enum": ["beetle", "grasshopper"]
},
"schema2": {
"$anchor": "fruit",
"type": "string",
"enum": ["orange", "apple"]
}
},
"$ref": "insect"
}
Então, qual é a diferença entre $id
e $anchor
?
$anchor
é uma string simples que identifica um local no documento do esquema. É usado na#
parte do fragmento ( ) de um$ref
URI. É uma alternativa à sintaxe JSON Pointer que você normalmente vê em referências (#/$defs/schema1
==#insect
). Portanto, seu segundo esquema não está correto. Está faltando o#
"inseto" anterior no arquivo$ref
.$id
é muito mais complicado. É um URI que identifica um recurso de esquema. O esquema pode ser referenciado por esse URI.$id
também pode aparecer dentro de um esquema como no primeiro exemplo. Nesse caso, o esquema onde$id
está localizado é considerado um esquema incorporado. Ele é tratado como seu próprio recurso de esquema independente separado do esquema pai no qual está incorporado. O URI para$id
esquemas incorporados pode ser resolvido em relação ao$id
do esquema pai para obter o URI completo que identifica o esquema incorporado. Portanto, o identificador do esquema com"$id": "insect"
é, na verdade,http://example.com/insect
."$ref": "insect"
corresponde a esse esquema porque também é resolvido em relação ao$id
esquema.Geralmente, os esquemas incorporados são usados apenas para agrupar esquemas desenvolvidos separadamente, mas que precisam ser distribuídos como um único esquema por algum motivo. Portanto, você não o usaria ao escrever um esquema, mas pode estar presente após uma etapa de construção.
Como
$id
identifica um esquema e$anchor
identifica um local dentro de um esquema, ocasionalmente você pode usar os dois juntos para fazer referência ao que precisa. Por exemplo, você pode fazer referênciahttp://example.com/schema#insect
para obter o esquema "inseto".http://example.com/schema
é definido por$id
e#insect
é definido por$anchor
.Você pode achar isso útil.