

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Visão geral do tipo de dados do JSON
<a name="json-document-overview"></a>

O ElastiCache é compatível com vários comandos do Valkey e do Redis OSS para trabalhar com o tipo de dados do JSON. Veja a seguir uma visão geral do tipo de dados do JSON e uma lista detalhada dos comandos que são compatíveis.

## Terminologia
<a name="json-terminology"></a>


****  

| Prazo | Descrição | 
| --- | --- | 
|  Documento JSON | Refere-se ao valor de uma chave do JSON. | 
|  Valor JSON | Refere-se a um subconjunto de um documento JSON, incluindo a raiz que representa o documento inteiro. Um valor poderia ser um contêiner ou uma entrada dentro de um contêiner. | 
|  Elemento JSON | Equivalente ao valor JSON. | 

## Padrão compatível com JSON
<a name="Supported-JSON-Standard"></a>

O formato JSON é compatível com os padrão de intercâmbio de dados do JSON [RFC 7159](https://www.ietf.org/rfc/rfc7159.txt) e [ECMA-404](https://www.ietf.org/rfc/rfc7159.txt). O padrão UTF-8 [Unicode](https://www.unicode.org/standard/WhatIsUnicode.html) é compatível com texto do JSON.

## Elemento raiz
<a name="json-root-element"></a>

O elemento raiz pode ser de qualquer tipo de dados do JSON. Observe que na RFC 4627 anterior, somente objetos ou matrizes eram permitidos como valores raiz. Desde a atualização para o RFC 7159, a raiz de um documento JSON pode ser de qualquer tipo de dados do JSON.

## Limite de tamanho de documentos
<a name="json-document-size-limit"></a>

Os documentos JSON são armazenados internamente em um formato que é otimizado para rápido acesso e modificação. Esse formato normalmente resulta no consumo um pouco maior de memória do que a representação serializada equivalente do mesmo documento. 

O consumo de memória por um único documento JSON é limitado a 64 MB, que é o tamanho da estrutura de dados na memória, não a string JSON. É possível verificar a quantidade de memória consumida por um documento JSON usando o comando `JSON.DEBUG MEMORY`.

## ACLs JSON
<a name="json-acls"></a>
+ Semelhante às categorias existentes por tipo de dados (@string, @hash etc.), uma nova categoria @json foi adicionada para simplificar o gerenciamento do acesso a comandos e dados do JSON. Nenhum outro comando do Valkey ou Redis OSS existente é membro da categoria @json. Todos os comandos JSON impõem restrições e permissões de keyspace ou de comando.
+ Existem cinco categorias existentes de ACL do Valkey e do Redis OSS que foram atualizadas para incluir os novos comandos JSON: @read, @write, @fast, @slow e @admin. A tabela a seguir indica o mapeamento de comandos JSON para as categorias apropriadas.


**ACL**  

| Comando JSON | @read | @write | @fast | @slow | @admin | 
| --- | --- | --- | --- | --- | --- | 
|  JSON.ARRAPPEND |  | y | y |  |  | 
|  JSON.ARRINDEX | y |  | y |  |  | 
|  JSON.ARRINSERT |  | y | y |  |  | 
|  JSON.ARRLEN | y |  | y |  |  | 
|  JSON.ARRPOP |  | y | y |  |  | 
|  JSON.ARRTRIM |  | y | y |  |  | 
|  JSON.CLEAR |  | y | y |  |  | 
|  JSON.DEBUG | y |  |  | y | y | 
|  JSON.DEL |  | y | y |  |  | 
|  JSON.FORGET |  | y | y |  |  | 
|  JSON.GET | y |  | y |  |  | 
|  JSON.MGET | y |  | y |  |  | 
|  JSON.NUMINCRBY |  | y | y |  |  | 
|  JSON.NUMMULTBY |  | y | y |  |  | 
|  JSON.OBJKEYS | y |  | y |  |  | 
|  JSON.OBJLEN | y |  | y |  |  | 
|  JSON.RESP | y |  | y |  |  | 
|  JSON.SET |  | y |  | y |  | 
|  JSON.STRAPPEND |  | y | y |  |  | 
|  JSON.STRLEN | y |  | y |  |  | 
|  JSON.STRLEN | y |  | y |  |  | 
|  JSON.TOGGLE |  | y | y |  |  | 
|  JSON.TYPE | y |  | y |  |  | 
|  JSON.NUMINCRBY |  | y | y |  |  | 

## Limite de profundidade de aninhamento
<a name="json-nesting-depth-limit"></a>

Quando um objeto ou matriz JSON tem um elemento que é outro objeto ou matriz JSON, diz-se que esse objeto interno ou matriz se “aninha” dentro do objeto ou matriz externa. O limite máximo de profundidade de aninhamento é 128. Qualquer tentativa de criar um documento que contenha uma profundidade de aninhamento maior que 128 será rejeitada com um erro.

## Sintaxe de comando
<a name="json-command-syntax"></a>

A maioria dos comandos exige um nome de chave como primeiro argumento. Alguns comandos também têm um argumento path (caminho). O argumento path (caminho) será padronizado para a raiz se for opcional e não fornecido.

 Notação:
+ Os argumentos obrigatórios são colocados entre colchetes angulares. Por exemplo: <key>
+ Os argumentos opcionais são colocados dentro de colchetes. Por exemplo: [path]
+ Os argumentos opcionais adicionais são indicados por reticências (“...”). Por exemplo: [json...]

## Sintaxe de caminho
<a name="json-path-syntax"></a>

O JSON do Redis oferece suporte a dois tipos de sintaxes de path:
+ **Sintaxe aprimorada**: veja abaixo a sintaxe JSONPath descrita por [Goessner](https://goessner.net/articles/JsonPath/), conforme mostrado na tabela a seguir. Reordenamos e modificamos as descrições na tabela para maior clareza.
+ **Sintaxe restrita** - Tem recursos de consulta limitados.

**nota**  
Os resultados de alguns comandos são sensíveis ao tipo de sintaxe de caminho usado.

 Se um caminho de consulta começar com '\$1', ele usará a sintaxe aprimorada. Caso contrário, a sintaxe restrita será usada.

Sintaxe aprimorada


****  

| Símbolo/Expressão | Descrição | 
| --- | --- | 
|  \$1 | O elemento raiz. | 
|  . ou [] | Operador filho. | 
|  .. | Descida recursiva. | 
|  \$1 | Curinga. Todos os elementos em um objeto ou matriz. | 
|  [] | Operador subscrito de matriz. O índice é baseado em 0. | 
|  [,] | Operador da união. | 
|  [start:end:step] | Operador de matriz slice. | 
|  ?() | Aplica uma expressão de filtro (script) à matriz ou objeto atual. | 
|  () | Expressão de filtro. | 
|  @ | Usado em expressões de filtro que consultam o nó atual que está sendo processado. | 
|  == | Igual a, usado em expressões de filtro. | 
|  \$1= | Não é igual a, usado em expressões de filtro. | 
|  > | Maior que, usado em expressões de filtro. | 
|  >= | Maior que ou igual a, usado em expressões de filtro.  | 
|  < | Menor que, usado em expressões de filtro. | 
|  <= | Menor que ou igual a, usado em expressões de filtro.  | 
|  && | AND lógico, usado para combinar várias expressões de filtro. | 
|  \$1\$1 | OR lógico, usado para combinar várias expressões de filtro. | 

**Exemplos**

Os exemplos a seguir têm como base o exemplo de dados XML de [Goessner](https://goessner.net/articles/JsonPath/), que modificamos acrescentando campos adicionais.

```
{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95,
        "in-stock": true,
        "sold": true
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99,
        "in-stock": false,
        "sold": true
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99,
        "in-stock": true,
        "sold": false
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99,
        "in-stock": false,
        "sold": false
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95,
      "in-stock": true,
      "sold": false
    }
  }
}
```


****  

| Caminho | Descrição | 
| --- | --- | 
|  \$1.store.book[\$1].author | Os autores de todos os livros da loja. | 
|  \$1..author | Todos os autores. | 
|  \$1.store.\$1 | Todos os membros da loja. | 
|  \$1["store"].\$1 | Todos os membros da loja. | 
|  \$1.store..price | O preço de tudo na loja. | 
|  \$1..\$1 | Todos os membros recursivos da estrutura JSON. | 
|  \$1..book[\$1] | Todos os livros. | 
|  \$1..book[0] | O primeiro livro. | 
|  \$1..book[-1] | O último livro. | 
|  \$1..book[0:2] | Os dois primeiros livros. | 
|  \$1..book[0,1] | Os dois primeiros livros. | 
|  \$1..book[0:4] | Livros do índice 0 a 3 (o índice final não é inclusivo). | 
|  \$1..book[0:4:2] | Livros no índice 0, 2. | 
|  \$1..book[?(@.isbn)] | Todos os livros com um número ISBN. | 
|  \$1..book[?(@.price<10)] | Todos os livros mais baratos que US\$1 10. | 
|  '\$1..book[?(@.price < 10)]' | Todos os livros são mais baratos do que US\$1 10. (O caminho deverá estar entre aspas se contiver espaços em branco.) | 
|  '\$1..book[?(@["price"] < 10)]' | Todos os livros mais baratos que US\$1 10. | 
|  '\$1..book[?(@.["price"] < 10)]' | Todos os livros mais baratos que US\$1 10. | 
|  \$1..book[?(@.price>=10&&@.price<=100)] | Todos os livros na faixa de preço entre US\$1 10 a US\$1 100, inclusive. | 
|  '\$1..book[?(@.price>=10 && @.price<=100)]' | Todos os livros na faixa de preço entre US\$1 10 a US\$1 100, inclusive. (O caminho deverá estar entre aspas se contiver espaços em branco.) | 
|  \$1..book[?(@.sold==true\$1\$1@.in-stock==false)] | Todos os livros vendidos ou esgotados. | 
|  '\$1..book[?(@.sold == true \$1\$1 @.in-stock == false)]' | Todos os livros vendidos ou esgotados. (O caminho deverá estar entre aspas se contiver espaços em branco.) | 
|  '\$1.store.book[?(@.["category"] == "fiction")]' | Todos os livros na categoria ficção. | 
|  '\$1.store.book[?(@.["category"] \$1= "fiction")]' | Todos os livros nas categorias não ficção. | 

Exemplos adicionais de expressões de filtro:

```
127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}'
OK
127.0.0.1:6379> JSON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)]
"[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]'
"[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]'
"[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]'
[{"price":15,"sold":false,"title":"abc"}]

127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]'
127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)]
"[3,4,5]"
127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]'
"[3,4,5]"

127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]'
OK
127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)]
"[true,true]"
127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]'
"[true,true]"
127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)]
"[2,3,4]"
127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]'
"[2,3,4]"
```

**Sintaxe restrita**


****  

| Símbolo/Expressão | Descrição | 
| --- | --- | 
|  . ou [] | Operador filho. | 
|  [] | Operador subscrito de matriz. O índice é baseado em 0. | 

**Exemplos**


****  

| Caminho | Descrição | 
| --- | --- | 
|  .store.book[0].author | O autor do primeiro livro. | 
|  .store.book[-1].author | O autor do último livro. | 
|  .address.city | Nome da cidade. | 
|  ["store"]["book"][0]["title"] | O título do primeiro livro. | 
|  ["store"]["book"][-1]["title"] | O título do último livro. | 

**nota**  
Todo conteúdo de [Goessner](https://goessner.net/articles/JsonPath/) citado nesta documentação está sujeito à [Licença da Creative Commons](https://creativecommons.org/licenses/by/2.5/).

## Prefixos de erro comuns
<a name="json-error-prefixes"></a>

Cada mensagem de erro tem um prefixo. Veja a seguir uma lista de prefixos de erro comuns.


****  

| Prefixo | Descrição | 
| --- | --- | 
|  ERR | Um erro geral. | 
|  LIMIT | Um erro que ocorre quando o limite de tamanho é excedido. Por exemplo, o limite de tamanho do documento ou limite de profundidade de aninhamento estava excedido. | 
|  NONEXISTENT | Uma chave ou caminho não existe. | 
|  OUTOFBOUNDARIES | Índice de matriz fora dos limites. | 
|  SYNTAXERR | Erro de sintaxe. | 
|  WRONGTYPE | Tipo de valor errado. | 

## Métricas relacionadas ao JSON
<a name="json-info-metrics"></a>

As seguintes métricas de informações JSON são fornecidas:


****  

| Informações | Descrição | 
| --- | --- | 
|  json\$1total\$1memory\$1bytes | Memória total alocada para objetos JSON. | 
|  json\$1num\$1documents | Número total de documentos no Valkey ou Redis OSS. | 

Para consultar as métricas principais, execute o seguinte comando:

```
info json_core_metrics
```

## Como o ElastiCache para Valkey e Redis OSS interage com JSON
<a name="json-differences"></a>

A seção a seguir descreve como o ElastiCache para Valkey e Redis OSS interage com o tipo de dados do JSON.

### Precedência do operador
<a name="json-operator-precedence"></a>

Ao avaliar expressões condicionais para filtragem, &&s têm precedência primeiro e, em seguida, \$1\$1s são avaliadas, como é comum na maioria das linguagens. As operações dentro de parênteses são executadas primeiro. 

### Comportamento do limite máximo de aninhamento de caminho
<a name="json-max-path"></a>

 O limite máximo de aninhamento de caminho no ElastiCache para Redis OSS é 128. Por isso, um valor como `$.a.b.c.d...` só pode atingir 128 níveis. 

### Processamento de valores numéricos
<a name="json-about-numbers"></a>

O JSON não tem tipos de dados separados para números inteiros e de ponto flutuante. Todos eles são chamados de números.

Representações numéricas:

Quando um número JSON é recebido na entrada, ele é convertido em uma das duas representações binárias internas: um valor inteiro com sinal de 64 bits ou um ponto flutuante de fluxo de precisão dupla de IEEE de 64 bits. A string original e toda a sua formatação não serão retidas. Dessa forma, quando um número é gerado como parte de uma resposta JSON, ele é convertido da representação binária interna para uma string imprimível que usa regras genéricas de formatação. Essas regras podem resultar em uma string diferente da que foi recebida.

Comandos aritméticos `NUMINCRBY` e `NUMMULTBY`:
+ Se ambos os números forem inteiros e o resultado estiver fora da faixa de `int64`, ele se tornará automaticamente um número IEEE de ponto flutuante de precisão dupla de 64 bits.
+ Se pelo menos um dos números for um ponto flutuante, o resultado será um número IEEE ponto flutuante de precisão dupla de 64 bits.
+ Se o resultado exceder a faixa de 64 bits IEEE dupla, o comando `OVERFLOW` retornará um erro.

Para obter uma lista detalhada dos comandos disponíveis, consulte [Comandos compatíveis do Valkey e do Redis OSSComandos JSON](json-list-commands.md).

### Filtragem direta de matriz
<a name="json-direct-array-filtering"></a>

O ElastiCache para Valkey ou Redis OSS filtra objetos de matriz diretamente.

Para dados como `[0,1,2,3,4,5,6]` e uma consulta de caminho como `$[?(@<4)]`, ou dados como `{"my_key":[0,1,2,3,4,5,6]}` e uma consulta de caminho como `$.my_key[?(@<4)]`, o ElastiCache retornaria [1,2,3] em ambas as circunstâncias. 

### Comportamento de indexação de matriz
<a name="json-direct-array-indexing"></a>

O ElastiCache para Valkey ou Redis OSS permite tanto os índices positivo quanto negativo para matrizes. Para uma matriz de comprimento cinco, 0 consultaria o primeiro elemento, 1 o segundo, e assim por diante. Números negativos começam no fim da matriz, então -1 consultaria o quinto elemento, -2 o quarto elemento e assim por diante.

Para garantir um comportamento previsível para os clientes, o ElastiCache não arredonda os índices de matriz para baixo ou para cima, portanto, se você tiver uma matriz com um comprimento de 5, chamar o índice 5 ou superior, ou -6 ou menor, não produzirá um resultado.

### Avaliação estrita da sintaxe
<a name="json-strict-syntax-evaluation"></a>

MemoryDB não permite caminhos JSON com sintaxe inválida, mesmo que um subconjunto do caminho contenha um caminho válido. Isso acontece para manter o comportamento correto para nossos clientes.