

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á.

# Conceitos básicos do JSON
<a name="json-gs"></a>

O MemoryDB suporta o formato nativo de JavaScript Object Notation (JSON), uma maneira simples e sem esquemas de codificar conjuntos de dados complexos dentro de clusters OSS Valkey ou Redis. Você pode armazenar e acessar dados de forma nativa usando o formato JavaScript Object Notation (JSON) dentro dos clusters e atualizar os dados JSON armazenados nesses clusters, sem precisar gerenciar código personalizado para serializá-los e desserializá-los.

Além de aproveitar o Valkey ou o Redis OSS APIs para aplicativos que operam em JSON, agora você pode recuperar e atualizar com eficiência partes específicas de um documento JSON sem precisar manipular o objeto inteiro, o que pode melhorar o desempenho e reduzir custos. Também é possível pesquisar o conteúdo do seu documento JSON usando a consulta `JSONPath` [estilo Goessner](https://goessner.net/articles/JsonPath/).

Depois de criar um cluster com uma versão de mecanismo compatível, o tipo de dados do JSON e os comandos associados estarão disponíveis automaticamente. Isso é compatível com a API e o RDB usando a versão 2 do módulo RedisJSON, para que você possa migrar facilmente aplicações do Valkey ou Redis OSS baseadas em JSON para o MemoryDB. Para ter mais informações sobre os comandos compatíveis, consulte [Comandos compatíveis](json-list-commands.md).

A métrica relacionada ao JSON `JsonBasedCmds` é incorporada CloudWatch para monitorar o uso desse tipo de dados. Para obter mais informações consulte [Métricas para MemoryDB](https://docs.aws.amazon.com/memorydb/latest/devguide/metrics.memorydb.html).

**nota**  
Para usar o JSON, é necessário executar o mecanismo do Valkey 7.2 ou posterior ou Redis OSS versão 6.2.6 ou posterior.

**Topics**
+ [Visão geral do tipo de dados JSON](json-document-overview.md)
+ [Comandos compatíveis](json-list-commands.md)

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

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

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


****  

| Prazo | Description | 
| --- | --- | 
|  Documento JSON | Refere-se ao valor de uma chave 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 acesso e modificação rápidos. 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 64MB, que é o tamanho da estrutura de dados na memória, não a string JSON. A quantidade de memória consumida por um documento JSON pode ser inspecionada usando o comando `JSON.DEBUG MEMORY`.

## JSON ACLs
<a name="json-acls"></a>
+ O tipo de dados JSON é totalmente integrado ao recurso de [listas de controle de acesso (ACLs)](https://valkey.io/topics/acl/) do Valkey e Redis OSS. 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 que são atualizadas para incluir os novos comandos JSON: @read, @write, @fast, @slow e @admin. A tabela abaixo 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 do Valkey ou Redis OSS 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]
+ Argumentos opcionais adicionais são indicados por..., por exemplo, [json...]

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

O JSON para Valkey e Redis OSS oferece suporte a dois tipos de sintaxe de caminho:
+ **Sintaxe aprimorada** — segue a JSONPath sintaxe descrita por [Goessner](https://goessner.net/articles/JsonPath/), conforme mostrado na tabela abaixo. 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 | Description | 
| --- | --- | 
|  \$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 abaixo 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
    }
  }
}
```


****  

| Path | Description | 
| --- | --- | 
|  \$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 com valor inferior a US\$1 10 | 
|  '\$1..book[?(@.price < 10)]' | todos os livros com valor inferior a US\$1 10. (O caminho deverá estar entre aspas se contiver espaços em branco.) | 
|  '\$1..book[?(@["price"] < 10)]' | todos os livros com valor inferior a US\$1 10 | 
|  '\$1..book[?(@.["price"] < 10)]' | todos os livros com valor inferior a US\$1 10 | 
|  \$1..book[?(@.price>=10&&@.price<=100)] | todos os livros na faixa de preço entre US\$1 10 e US\$1 100, inclusive | 
|  '\$1..book[?(@.price>=10 && @.price<=100)]' | todos os livros na faixa de preço entre US\$1 10 e 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 | 

Mais exemplos 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 | Description | 
| --- | --- | 
|  . ou [] | operador filho | 
|  [] | operador subscrito de matriz. O índice é baseado em 0. | 

**Exemplos**


****  

| Path | Description | 
| --- | --- | 
|  .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 | Description | 
| --- | --- | 
|  ERR | um erro geral | 
|  LIMIT | erro de limite de tamanho excedido. Por exemplo, o limite de tamanho do documento ou o limite de profundidade de aninhamento 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 | Description | 
| --- | --- | 
|  json\$1total\$1memory\$1bytes | memória total alocada para objetos JSON | 
|  json\$1num\$1documents | Número total de documentos no mecanismo Valkey ou Redis OSS. | 

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

```
info json_core_metrics
```

## Como o MemoryDB interage com o JSON
<a name="json-differences"></a>

O exemplo a seguir ilustra como o MemoryDB interage com o tipo de dados 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 dos parênteses serã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 do MemoryDB é 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.

Quando um número JSON é recebido, ele é armazenado em um de dois formatos. Se o número couber em um inteiro assinado de 64 bits, será convertido para esse formato; caso contrário, será armazenado como uma string. As operações aritméticas em dois números JSON (por exemplo, JSON.NUMINCRBY e JSON.NUMMULTBY) tentam preservar o máximo de precisão possível. Se os dois operandos e o valor resultante couberem em um inteiro assinado de 64 bits, a aritmética de números inteiros será executada. Caso contrário, os operandos de entrada são convertidos em números de ponto flutuante de precisão dupla IEEE de 64 bits, a operação aritmética é executada e o resultado é convertido novamente em uma string.

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 flutuante de precisão dupla.
+ Se pelo menos um dos números for um ponto flutuante, o resultado será um número de ponto flutuante de precisão dupla.
+ Se o resultado exceder o intervalo de dupla, o comando retornará um erro `OVERFLOW`.

**nota**  
Antes da versão 6.2.6.R2 do mecanismo Redis OSS, quando um número JSON é recebido na entrada, ele é convertido em uma das duas representações binárias internas: um inteiro assinado de 64 bits ou um ponto flutuante de precisão dupla 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.  
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](json-list-commands.md).

### 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.

# Comandos compatíveis
<a name="json-list-commands"></a>

Os seguintes comandos JSON são compatíveis:

**Topics**
+ [JSON.ARRAPPEND](json-arrappend.md)
+ [JSON.ARRINDEX](json-arrindex.md)
+ [JSON.ARRINSERT](json-arrinsert.md)
+ [JSON.ARRLEN](json-arrlen.md)
+ [JSON.ARRPOP](json-arrpop.md)
+ [JSON.ARRTRIM](json-arrtrim.md)
+ [JSON.CLEAR](json-clear.md)
+ [JSON.DEBUG](json-debug.md)
+ [JSON.DEL](json-del.md)
+ [JSON.FORGET](json-forget.md)
+ [JSON.GET](json-get.md)
+ [JSON.MGET](json-mget.md)
+ [JSON.NUMINCRBY](json-numincrby.md)
+ [JSON.NUMMULTBY](json-nummultby.md)
+ [JSON.OBJLEN](json-objlen.md)
+ [JSON.OBJKEYS](json-objkeys.md)
+ [JSON.RESP](json-resp.md)
+ [JSON.SET](json-set.md)
+ [JSON.STRAPPEND](json-strappend.md)
+ [JSON.STRLEN](json-strlen.md)
+ [JSON.TOGGLE](json-toggle.md)
+ [JSON.TYPE](json-type.md)

# JSON.ARRAPPEND
<a name="json-arrappend"></a>

Anexa um ou mais valores aos valores da matriz no caminho.

Sintaxe

```
JSON.ARRAPPEND <key> <path> <json> [json ...]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (obrigatório): um caminho JSON
+ json (obrigatório): o valor JSON a ser anexado à matriz

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de números inteiros, representando o novo comprimento da matriz em cada caminho.
+ Se um valor não for uma matriz, seu valor de retorno correspondente será nulo.
+ Erro `SYNTAXERR` se um dos argumentos de entradas json não for uma string JSON válida.
+ `NONEXISTENT` erro se o caminho não existir.

Se o caminho for uma sintaxe restrita:
+ Inteiro, o novo comprimento da matriz.
+ Se vários valores de matriz forem selecionados, o comando retornará o novo comprimento da última matriz atualizada.
+ Erro `WRONGTYPE` se o valor no caminho não for uma matriz.
+ Erro `SYNTAXERR` se um dos argumentos de entradas json não for uma string JSON válida.
+ `NONEXISTENT` erro se o caminho não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 $[*] '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"a\",\"c\"],[\"a\",\"b\",\"c\"]]"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 [-1] '"c"'
(integer) 3
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"],[\"a\",\"b\",\"c\"]]"
```

# JSON.ARRINDEX
<a name="json-arrindex"></a>

Procura a primeira ocorrência de um valor escalar JSON nas matrizes no caminho.
+ Erros fora do intervalo são tratados arredondando o índice para o início e o fim da matriz.
+ Se início > fim, retorna -1 (não encontrado).

Sintaxe

```
JSON.ARRINDEX <key> <path> <json-scalar> [start [end]]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (obrigatório): um caminho JSON
+ json-scalar (obrigatório): valor escalar a ser pesquisado; escalar JSON se refere a valores que não são objetos ou matrizes. Ou seja, String, number, boolean e null são valores escalares.
+ início (opcional): o índice inicial, inclusive. Assumirá o padrão de 0 se não for fornecido.
+ fim (opcional): o índice final, exclusivo. Assumirá o padrão de 0 se não for fornecido, significa que o último elemento está incluído. 0 ou -1 significa que o último elemento está incluído.

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de números inteiros. Cada valor é o índice do elemento correspondente na matriz no caminho. O valor é -1, se não encontrado.
+ Se um valor não for uma matriz, seu valor de retorno correspondente será nulo.

Se o caminho for uma sintaxe restrita:
+ Inteiro, o índice do elemento correspondente ou -1 se não for encontrado.
+ Erro `WRONGTYPE` se o valor no caminho não for uma matriz.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 $[*] '"b"'
1) (integer) -1
2) (integer) -1
3) (integer) 1
4) (integer) 1
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 .children '"Tom"'
(integer) 2
```

# JSON.ARRINSERT
<a name="json-arrinsert"></a>

Insere um ou mais valores nos valores da matriz no caminho antes do índice.

Sintaxe

```
JSON.ARRINSERT <key> <path> <index> <json> [json ...]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (obrigatório): um caminho JSON
+ índice (obrigatório): um índice de matriz antes do qual os valores são inseridos.
+ json (obrigatório): o valor JSON a ser anexado à matriz

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de números inteiros, representando o novo comprimento da matriz em cada caminho.
+ Se um valor for uma matriz vazia, seu valor de retorno correspondente será nulo.
+ Se um valor não for uma matriz, seu valor de retorno correspondente será nulo.
+ Erro `OUTOFBOUNDARIES` se o argumento índice estiver fora dos limites.

Se o caminho for uma sintaxe restrita:
+ Inteiro, o novo comprimento da matriz.
+ Erro `WRONGTYPE` se o valor no caminho não for uma matriz.
+ Erro `OUTOFBOUNDARIES` se o argumento índice estiver fora dos limites.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 $[*] 0 '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"c\",\"a\"],[\"c\",\"a\",\"b\"]]"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 . 0 '"c"'
(integer) 4
127.0.0.1:6379> JSON.GET k1
"[\"c\",[],[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRLEN
<a name="json-arrlen"></a>

Obtém o comprimento dos valores da matriz no caminho.

Sintaxe

```
JSON.ARRLEN <key> [path] 
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de inteiros que representa o comprimento da matriz em cada caminho.
+ Se um valor não for uma matriz, seu valor de retorno correspondente será nulo.
+ Nulo se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ Matriz de strings em massa. Cada elemento é um nome de chave no objeto.
+ Inteiro, comprimento da matriz.
+ Se vários objetos forem selecionados, o comando retornará o comprimento da primeira matriz.
+ Erro `WRONGTYPE` se o valor no caminho não for uma matriz.
+ `WRONGTYPE` erro se o caminho não existir.
+ Nulo se a chave do documento não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], [\"a\"], [\"a\", \"b\"], [\"a\", \"b\", \"c\"]]'
(error) SYNTAXERR Failed to parse JSON string due to syntax error
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRLEN k1 $[*]
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]'
OK
127.0.0.1:6379> JSON.ARRLEN k2 $[*]
1) (integer) 0
2) (nil)
3) (integer) 2
4) (integer) 3
5) (nil)
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRLEN k1 [*]
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k1 $[3]
1) (integer) 3

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]'
OK
127.0.0.1:6379> JSON.ARRLEN k2 [*]
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k2 $[1]
1) (nil)
127.0.0.1:6379> JSON.ARRLEN k2 $[2]
1) (integer) 2
```

# JSON.ARRPOP
<a name="json-arrpop"></a>

Remove e retorna elemento no índice da matriz. Exibir uma matriz vazia retorna nulo.

Sintaxe

```
JSON.ARRPOP <key> [path [index]]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido
+ índice (opcional): posição na matriz a partir da qual começar a exibir.
  + O padrão é -1 se não é fornecido, o que significa o último elemento.
  + O valor negativo significa posição do último elemento.
  + Os índices fora do limite são arredondados para seus respectivos limites de matriz.

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de strings em massa que representam os valores exibidos em cada caminho.
+ Se um valor for uma matriz vazia, seu valor de retorno correspondente será nulo.
+ Se um valor não for uma matriz, seu valor de retorno correspondente será nulo.

Se o caminho for uma sintaxe restrita:
+ String em massa, representando o valor JSON exibido
+ Nulo se a matriz estiver vazia.
+ Erro `WRONGTYPE` se o valor no caminho não for uma matriz.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1 $[*]
1) (nil)
2) "\"a\""
3) "\"b\""
127.0.0.1:6379> JSON.GET k1
"[[],[],[\"a\"]]"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1
"[\"a\",\"b\"]"
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"]]"

127.0.0.1:6379> JSON.SET k2 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k2 . 0
"[]"
127.0.0.1:6379> JSON.GET k2
"[[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRTRIM
<a name="json-arrtrim"></a>

Reduz as matrizes no caminho para que se tornem sub matrizes [start, end], ambas inclusive.
+ Se a matriz estiver vazia, não faça nada, retorne 0.
+ Se início for < 0, trate-a como 0.
+ Se fim for >= tamanho (tamanho da matriz), trate-a como tamanho-1.
+ Se início for >= tamanho ou início for > fim, esvazie a matriz e retorne 0.

Sintaxe

```
JSON.ARRINSERT <key> <path> <start> <end>
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (obrigatório): um caminho JSON
+ início (obrigatório): índice inicial, inclusive.
+ fim (obrigatório): índice final, inclusive.

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de números inteiros, representando o novo comprimento da matriz em cada caminho.
+ Se um valor for uma matriz vazia, seu valor de retorno correspondente será nulo.
+ Se um valor não for uma matriz, seu valor de retorno correspondente será nulo.
+ Erro `OUTOFBOUNDARIES` se um argumento índice estiver fora dos limites.

Se o caminho for uma sintaxe restrita:
+ Inteiro, o novo comprimento da matriz.
+ Nulo se a matriz estiver vazia.
+ Erro `WRONGTYPE` se o valor no caminho não for uma matriz.
+ Erro `OUTOFBOUNDARIES` se um argumento índice estiver fora dos limites.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 $[*] 0 1
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 2
   127.0.0.1:6379> JSON.GET k1
   "[[],[\"a\"],[\"a\",\"b\"],[\"a\",\"b\"]]"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 .children 0 1
(integer) 2
127.0.0.1:6379> JSON.GET k1 .children
"[\"John\",\"Jack\"]"
```

# JSON.CLEAR
<a name="json-clear"></a>

Limpa as matrizes ou um objeto no caminho.

Sintaxe

```
JSON.CLEAR <key> [path]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**
+ Inteiro, o número de contêineres limpos.
+ Limpar uma matriz ou objeto vazio conta como 0 contêiner limpo.
**nota**  
Antes da versão 6.2.6.R2 do Redis OSS, a limpeza de uma matriz ou objeto vazio conta como 1 contêiner limpo.
+ Limpar um valor que não seja do contêiner retorna 0.
+ Se nenhum valor de matriz ou objeto estiver localizado no caminho, o comando retorna 0.

**Exemplos**

```
127.0.0.1:6379> JSON.SET k1 . '[[], [0], [0,1], [0,1,2], 1, true, null, "d"]'
OK
127.0.0.1:6379>  JSON.CLEAR k1  $[*]
(integer) 6
127.0.0.1:6379> JSON.CLEAR k1  $[*]
(integer) 0
127.0.0.1:6379> JSON.SET k2 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.CLEAR k2 .children
(integer) 1
127.0.0.1:6379> JSON.GET k2 .children
"[]"
```

# JSON.DEBUG
<a name="json-debug"></a>

Informações do relatório. Os subcomandos compatíveis são:
+ MEMORY <key> [path]: informa o uso de memória em bytes de um valor JSON. O caminho assumirá o padrão da raiz se não for fornecido.
+ DEPTH <key> [caminho]: informa a profundidade máxima do caminho do documento JSON.
**nota**  
Esse subcomando está disponível somente usando o mecanismo do Valkey 7.2 ou posterior ou Redis OSS versão 6.2.6.R2 ou posterior.
+ FIELDS <key> [path]: informa o número de campos no caminho do documento especificado. O caminho assumirá o padrão da raiz se não for fornecido. Cada valor JSON não contêiner conta como um campo. Objetos e matrizes contam recursivamente como um campo para cada um dos valores JSON que contêm. Cada valor de contêiner, exceto o contêiner raiz, conta como um campo adicional.
+ HELP: imprime mensagens de ajuda referentes ao comando.

Sintaxe

```
JSON.DEBUG <subcommand & arguments>
```

Depende do subcomando:

MEMORY
+ Se o caminho for uma sintaxe aprimorada:
  + Retorna uma matriz de inteiros, que representa o tamanho da memória (em bytes) do valor JSON em cada caminho.
  + Retorna uma matriz vazia quando a chave não existe.
+ Se o caminho for uma sintaxe restrita:
  + retorna um número inteiro, o tamanho da memória do valor JSON em bytes.
  + Retorna nulo quando a chave não existe.

DEPTH
+ Retorna um número inteiro que representa a profundidade máxima do caminho do documento JSON.
+ Retorna nulo quando a chave não existe.

FIELDS
+ Se o caminho for uma sintaxe aprimorada:
  + Retorna uma matriz de inteiros, que representa o número de campos do valor JSON em cada caminho.
  + Retorna uma matriz vazia quando a chave não existe.
+ Se o caminho for uma sintaxe restrita:
  + retorna um número inteiro, número de campos do valor JSON.
  + Retorna nulo quando a chave não existe.

HELP: retorna uma série de mensagens de ajuda.

**Exemplos**

Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, [], {"a":1, "b":2}, [1,2,3]]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1 $[*]
1) (integer) 16
2) (integer) 16
3) (integer) 19
4) (integer) 16
5) (integer) 16
6) (integer) 16
7) (integer) 16
8) (integer) 50
9) (integer) 64
127.0.0.1:6379> JSON.DEBUG FIELDS k1 $[*]
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 1
5) (integer) 1
6) (integer) 0
7) (integer) 0
8) (integer) 2
9) (integer) 3
```

Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1
(integer) 632
127.0.0.1:6379> JSON.DEBUG MEMORY k1 .phoneNumbers
(integer) 166

127.0.0.1:6379> JSON.DEBUG FIELDS k1
(integer) 19
127.0.0.1:6379> JSON.DEBUG FIELDS k1 .address
(integer) 4

127.0.0.1:6379> JSON.DEBUG HELP
1) JSON.DEBUG MEMORY <key> [path] - report memory size (bytes) of the JSON element. Path defaults to root if not provided.
2) JSON.DEBUG FIELDS <key> [path] - report number of fields in the JSON element. Path defaults to root if not provided.
3) JSON.DEBUG HELP - print help message.
```

# JSON.DEL
<a name="json-del"></a>

Exclui os valores JSON no caminho em uma chave de documento. Se o caminho é a raiz, é equivalente a excluir a chave do Valkey ou Redis OSS.

Sintaxe

```
JSON.DEL <key> [path]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**
+ Número de elementos excluídos.
+ 0 quando a chave não existe.
+ 0 se o caminho JSON for inválido ou não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 $.d.*
(integer) 3
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 $.e[*]
(integer) 5
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 .d.*
(integer) 3
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 .e[*]
(integer) 5
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

# JSON.FORGET
<a name="json-forget"></a>

Um alias de [JSON.DEL](json-del.md)

# JSON.GET
<a name="json-get"></a>

Retorna o JSON serializado em um ou vários caminhos.

Sintaxe

```
JSON.GET <key>
[INDENT indentation-string]
[NEWLINE newline-string]
[SPACE space-string]
[NOESCAPE]
[path ...]
```
+ key (obrigatório): chave do tipo de documento JSON
+ INDENT/NEWLINE/SPACE(opcional) — controla o formato da string JSON retornada, ou seja, “impressão bonita”. O valor padrão de cada um é string vazia. Podem ser anulados em qualquer combinação. Eles podem ser especificados em qualquer ordem.
+ NOESCAPE: opcional, presença permitida para compatibilidade com legado e não tem outro efeito.
+ path (opcional): zero ou mais caminhos JSON, assumirá o padrão de raiz se nenhum for fornecido. Os argumentos do caminho devem ser colocados no final.

**Return**

Sintaxe do caminho aprimorada:

 Se um caminho for fornecido:
+ Retornará a string serializada de uma matriz de valores.
+ Se nenhum valor for selecionado, o comando retornará uma matriz vazia.

 Se vários caminhos forem fornecidos:
+ Retornará um objeto JSON em formato de string, no qual cada caminho é uma chave.
+ Se houver sintaxe mista de caminho aprimorado e restrito, o resultado estará de acordo com a sintaxe aprimorada.
+ Se um caminho não existir, seu valor correspondente será uma matriz vazia.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 $.address.*
"[\"21 2nd Street\",\"New York\",\"NY\",\"10021-3100\"]"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" $.address.*
"[\n\t\"21 2nd Street\",\n\t\"New York\",\n\t\"NY\",\n\t\"10021-3100\"\n]"
127.0.0.1:6379> JSON.GET k1 $.firstName $.lastName $.age
"{\"$.firstName\":[\"John\"],\"$.lastName\":[\"Smith\"],\"$.age\":[27]}"            
127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}}'
OK
127.0.0.1:6379> json.get k2 $..*
"[{},{\"a\":1},{\"a\":1,\"b\":2},1,1,2]"
```

 Sintaxe do caminho restrita:

```
 127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 .address
"{\"street\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"zipcode\":\"10021-3100\"}"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" .address
"{\n\t\"street\": \"21 2nd Street\",\n\t\"city\": \"New York\",\n\t\"state\": \"NY\",\n\t\"zipcode\": \"10021-3100\"\n}"
127.0.0.1:6379> JSON.GET k1 .firstName .lastName .age
"{\".firstName\":\"John\",\".lastName\":\"Smith\",\".age\":27}"
```

# JSON.MGET
<a name="json-mget"></a>

Seja serializado JSONs no caminho a partir de várias chaves do documento. Retorna nulo para uma chave ou caminho JSON não existente.

Sintaxe

```
JSON.MGET <key> [key ...] <path>
```
+ key (obrigatório): uma ou mais chaves do tipo de documento.
+ path (obrigatório): um caminho JSON

**Return**
+ Matriz de Strings em Massa. O tamanho da matriz é igual ao número de chaves no comando. Cada elemento da matriz será preenchido com (a) o JSON serializado conforme localizado pelo caminho ou (b) Null se a chave não existir, o caminho não existir no documento ou o caminho for inválido (erro de sintaxe).
+ Se alguma das chaves especificadas existir e não for uma chave JSON, o comando retornará o erro `WRONGTYPE`.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK
127.0.0.1:6379> JSON.MGET k1 k2 k3 $.address.city
1) "[\"New York\"]"
2) "[\"Boston\"]"
3) "[\"Seattle\"]"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK

127.0.0.1:6379> JSON.MGET k1 k2 k3 .address.city
1) "\"New York\""
2) "\"Seattle\""
3) "\"Seattle\""
```

# JSON.NUMINCRBY
<a name="json-numincrby"></a>

Incrementa os valores numéricos no caminho por um determinado número.

Sintaxe

```
JSON.NUMINCRBY <key> <path> <number>
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (obrigatório): um caminho JSON
+ número (obrigatório): um número

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de strings em massa que representa o valor resultante em cada caminho.
+ Se um valor não for um número, seu valor de retorno correspondente será nulo.
+ Erro `WRONGTYPE` se o número não puder ser analisado.
+ Erro `OVERFLOW` se o resultado estiver fora do intervalo de duplo IEEE de 64 bits.
+ `NONEXISTENT` se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ Matriz de strings em massa que representa os valores resultantes.
+ Se vários valores forem selecionados, o comando retornará o resultado do último valor atualizado.
+ Erro `WRONGTYPE` se o valor no caminho não for um número.
+ Erro `WRONGTYPE` se o número não puder ser analisado.
+ Erro `OVERFLOW` se o resultado estiver fora do intervalo de duplo IEEE de 64 bits.
+ `NONEXISTENT` se a chave do documento não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 10
"[11,12,13]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[11,12,13]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.a[*] 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.b[*] 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.c[*] 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 $.a.* 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.b.* 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.c.* 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.d.* 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 $.a.* 1
"[null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.b.* 1
"[null,2]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.c.* 1
"[null,null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.d.* 1
"[2,null,4]"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":4}}"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[1] 10
"12"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,12,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .a[*] 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k1 .b[*] 1
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .c[*] 1
"3"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[*] 1
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 .a.* 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k2 .b.* 1
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .c.* 1
"3"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .d.* 1
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 .a.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .b.* 1
"2"
127.0.0.1:6379> JSON.NUMINCRBY k3 .c.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .d.* 1
"4"
```

# JSON.NUMMULTBY
<a name="json-nummultby"></a>

Multiplica os valores numéricos no caminho por um determinado número.

Sintaxe

```
JSON.NUMMULTBY <key> <path> <number>
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (obrigatório): um caminho JSON
+ número (obrigatório): um número

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de strings em massa que representa o valor resultante em cada caminho.
+ Se um valor não for um número, seu valor de retorno correspondente será nulo.
+ Erro `WRONGTYPE` se o número não puder ser analisado.
+ Erro `OVERFLOW` se o resultado estiver fora do intervalo de duplo IEEE de 64 bits.
+ `NONEXISTENT` se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ Matriz de strings em massa que representa os valores resultantes.
+ Se vários valores forem selecionados, o comando retornará o resultado do último valor atualizado.
+ Erro `WRONGTYPE` se o valor no caminho não for um número.
+ Erro `WRONGTYPE` se o número não puder ser analisado.
+ Erro `OVERFLOW` se o resultado estiver fora do intervalo de duplo IEEE de 64 bits.
+ `NONEXISTENT` se a chave do documento não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.a[*] 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.b[*] 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.c[*] 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 $.a.* 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.b.* 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.c.* 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.d.* 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 $.a.* 2
"[null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.b.* 2
"[null,2]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.c.* 2
"[null,null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.d.* 2
"[2,null,6]"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[1] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,4,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .a[*] 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k1 .b[*] 2
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .c[*] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[*] 2
"6"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 .a.* 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k2 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .c.* 2
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":2,\"b\":4,\"c\":6}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 .a.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":1,\"b\":\"b\",\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k3 .c.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":6}}"
```

# JSON.OBJLEN
<a name="json-objlen"></a>

Obtém o número de chaves nos valores do objeto no caminho.

Sintaxe

```
JSON.OBJLEN <key> [path]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de inteiros que representa o comprimento do objeto em cada caminho.
+ Se um valor não for um objeto, seu valor de retorno correspondente será nulo.
+ Nulo se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ Inteiro, número de chaves no objeto.
+ Se vários objetos forem selecionados, o comando retornará o comprimento do primeiro objeto.
+ Erro `WRONGTYPE` se o valor no caminho não for um objeto.
+ `WRONGTYPE` erro se o caminho não existir.
+ Nulo se a chave do documento não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 $.a
1) (integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 $.a.*
(empty array)
127.0.0.1:6379> JSON.OBJLEN k1 $.b
1) (integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 $.b.*
1) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.c
1) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.c.*
1) (nil)
2) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.d
1) (integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 $.d.*
1) (nil)
2) (nil)
3) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.*
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3
5) (nil)
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 .a
(integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 .a.*
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.OBJLEN k1 .b
(integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 .b.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .c
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .c.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .d
(integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 .d.*
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .*
(integer) 0
```

# JSON.OBJKEYS
<a name="json-objkeys"></a>

Obtém nomes de chave nos valores de objeto no caminho.

Sintaxe

```
JSON.OBJKEYS <key> [path]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de matriz de strings em massa. Cada elemento é uma matriz de chaves em um objeto correspondente.
+ Se um valor não for um objeto, seu valor de retorno correspondente será vazio.
+ Nulo se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ Matriz de strings em massa. Cada elemento é um nome de chave no objeto.
+ Se vários objetos forem selecionados, o comando retornará as chaves do primeiro objeto.
+ Erro `WRONGTYPE` se o valor no caminho não for um objeto.
+ `WRONGTYPE` erro se o caminho não existir.
+ Nulo se a chave do documento não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 $.*
1) (empty array)
2) 1) "a"
3) 1) "a"
   2) "b"
4) 1) "a"
   2) "b"
   3) "c"
5) (empty array)
127.0.0.1:6379> JSON.OBJKEYS k1 $.d
1) 1) "a"
   2) "b"
   3) "c"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 .*
1) "a"
127.0.0.1:6379> JSON.OBJKEYS k1 .d
1) "a"
2) "b"
3) "c"
```

# JSON.RESP
<a name="json-resp"></a>

Retorna o valor JSON em determinado caminho fornecido no Valkey ou Redis OSS Serialization Protocol (RESP). Se o valor for contêiner, a resposta será uma matriz RESP ou matriz aninhada.
+ JSON nulo é mapeado para o RESP Null Bulk String.
+ Valores booleanos JSON são associados às respectivas RESP Simple Strings.
+ Os números inteiros são mapeados para números inteiros RESP.
+ Os números de ponto flutuante duplo IEEE de 64 bits são mapeados para RESP Bulk Strings.
+ As strings JSON são mapeadas para RESP Bulk Strings.
+ As matrizes JSON são representados como matrizes RESP, onde o primeiro elemento é a string simples [, seguida pelos elementos da matriz.
+ Os objetos JSON são representados como matrizes RESP, onde o primeiro elemento é a string simples \$1, seguida por pares de valores-chave, cada um dos quais é uma string RESP em massa.

Sintaxe

```
JSON.RESP <key> [path]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de matrizes. Cada elemento da matriz representa a forma RESP do valor em um caminho.
+ Matriz vazia se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ Matriz que representa a forma RESP do valor em um caminho.
+ Nulo se a chave do documento não existir.

**Exemplos**

Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 $.address
1) 1) {
   2) 1) "street"
      2) "21 2nd Street"
   3) 1) "city"
      2) "New York"
   4) 1) "state"
      2) "NY"
   5) 1) "zipcode"
      2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.address.*
1) "21 2nd Street"
2) "New York"
3) "NY"
4) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers
1) 1) [
   2) 1) {
      2) 1) "type"
         2) "home"
      3) 1) "number"
         2) "555 555-1234"
   3) 1) {
      2) 1) "type"
         2) "office"
      3) 1) "number"
         2) "555 555-4567"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers[*]
1) 1) {
   2) 1) "type"
      2) "home"
   3) 1) "number"
      2) "212 555-1234"
2) 1) {
   2) 1) "type"
      2) "office"
   3) 1) "number"
      2) "555 555-4567"
```

Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 .address
1) {
2) 1) "street"
   2) "21 2nd Street"
3) 1) "city"
   2) "New York"
4) 1) "state"
   2) "NY"
5) 1) "zipcode"
   2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1
 1) {
 2) 1) "firstName"
    2) "John"
 3) 1) "lastName"
    2) "Smith"
 4) 1) "age"
    2) (integer) 27
 5) 1) "weight"
    2) "135.25"
 6) 1) "isAlive"
    2) true
 7) 1) "address"
    2) 1) {
       2) 1) "street"
          2) "21 2nd Street"
       3) 1) "city"
          2) "New York"
       4) 1) "state"
          2) "NY"
       5) 1) "zipcode"
          2) "10021-3100"
 8) 1) "phoneNumbers"
    2) 1) [
       2) 1) {
          2) 1) "type"
             2) "home"
          3) 1) "number"
             2) "212 555-1234"
       3) 1) {
          2) 1) "type"
             2) "office"
          3) 1) "number"
             2) "555 555-4567"
 9) 1) "children"
    2) 1) [
10) 1) "spouse"
    2) (nil)
```

# JSON.SET
<a name="json-set"></a>

Define os valores JSON no caminho.

Se o caminho exigir um membro do objeto:
+ Se o elemento pai não existir, o comando retornará o erro NONEXISTENT.
+ Se o elemento pai existir, mas não for um objeto, o comando retornará ERROR.
+ Se o elemento pai existir e for um objeto:
  +  Se o membro não existir, um novo membro será anexado ao objeto pai se e somente se o objeto pai for o último filho no caminho. Caso contrário, o comando retornará o erro NONEXISTENT.
  +  Se o membro existir, seu valor será substituído pelo valor JSON.

Se o caminho exigir um índice de matriz:
+ Se o elemento pai não existir, o comando retornará o erro NONEXISTENT.
+ Se o elemento pai existir, mas não for uma matriz o comando retornará ERROR.
+ Se o elemento pai existir, mas o índice estiver fora dos limites, o comando retornará o erro OUTOFBOUNDARIES.
+ Se o elemento pai existir e o índice for válido, o elemento será substituído pelo novo valor JSON.

Se o caminho solicitar um objeto ou matriz, o valor (objeto ou matriz) será substituído pelo novo valor JSON.

Sintaxe

```
JSON.SET <key> <path> <json> [NX | XX] 
```

[NX \$1 XX] Onde é possível ter 0 ou 1 de identificadores [NX \$1 XX]
+ key (obrigatório): chave do tipo de documento JSON
+ path (obrigatório): um caminho JSON. Para uma nova chave, o caminho JSON deve ser a raiz “.”.
+ NX (opcional): se o caminho for a raiz, defina o valor somente se a chave não existir, ou seja, insira um novo documento. Se o caminho não for a raiz, defina o valor somente se o caminho não existir, ou seja, insira um valor no documento.
+ XX (opcional): se o caminho for a raiz, defina o valor somente se a chave existir, ou seja, substitua o documento existente. Se o caminho não for a raiz, defina o valor somente se o caminho existir, ou seja, atualize o valor existente.

**Return**
+ String simples 'OK' em caso de sucesso.
+ Nulo se a condição NX ou XX não for atendida.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.SET k1 $.a.* '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"a\":{\"a\":0,\"b\":0,\"c\":0}}"

127.0.0.1:6379> JSON.SET k2 . '{"a": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k2 $.a[*] '0'
OK
127.0.0.1:6379> JSON.GET k2
"{\"a\":[0,0,0,0,0]}"
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"c":{"a":1, "b":2}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k1 .c.a '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.SET k1 .e[-1] '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,0]}"
127.0.0.1:6379> JSON.SET k1 .e[5] '0'
(error) OUTOFBOUNDARIES Array index is out of bounds
```

# JSON.STRAPPEND
<a name="json-strappend"></a>

Anexa uma string às strings JSON no caminho.

Sintaxe

```
JSON.STRAPPEND <key> [path] <json_string>
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido
+ json\$1string (obrigatório): a representação JSON de uma string. Observe que uma string JSON deve estar entre aspas, ou seja, “foo”.

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de inteiros, representando o novo comprimento da matriz em cada caminho.
+ Se um valor não for uma string, seu valor de retorno correspondente será nulo.
+ Erro `SYNTAXERR ` se o argumento de entrada json não for uma string JSON válida.
+ Erro `NONEXISTENT ` se o caminho não existir.

Se o caminho for uma sintaxe restrita:
+ Inteiro, o novo comprimento da string.
+ Se vários valores de string forem selecionados, o comando retornará o novo comprimento da última string atualizada.
+ Erro `WRONGTYPE` se o valor no caminho não for uma string.
+ Erro `WRONGTYPE` se o argumento da entrada json não for uma string JSON válida.
+ `NONEXISTENT` erro se o caminho não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.a '"a"'
1) (integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.* '"a"'
1) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.b.* '"a"'
1) (integer) 2
2) (nil)
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.* '"a"'
1) (integer) 2
2) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.b '"a"'
1) (integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 $.d.* '"a"'
1) (nil)
2) (integer) 2
3) (nil)
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 .a.a '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .a.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .b.* '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .c.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .c.b '"a"'
(integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 .d.* '"a"'
(integer) 2
```

# JSON.STRLEN
<a name="json-strlen"></a>

Obtém o comprimento dos valores da string JSON no caminho.

Sintaxe

```
JSON.STRLEN <key> [path] 
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de inteiros, que representa o comprimento do valor da string em cada caminho.
+ Se um valor não for uma string, seu valor correspondente será nulo.
+ Nulo se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ Inteiro, o comprimento da string.
+ Se vários valores de string forem selecionados, o comando retornará o comprimento da primeira string.
+ Erro `WRONGTYPE` se o valor no caminho não for uma string.
+ `NONEXISTENT` erro se o caminho não existir.
+ Nulo se a chave do documento não existir.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 $.a.a
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.a.*
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.c.*
1) (integer) 1
2) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.c.b
1) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.d.*
1) (nil)
2) (integer) 1
3) (nil)
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 .a.a
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .a.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.b
(integer) 2
127.0.0.1:6379> JSON.STRLEN k1 .d.*
(integer) 1
```

# JSON.TOGGLE
<a name="json-toggle"></a>

Alterna valores booleanos entre verdadeiro e falso no caminho.

Sintaxe

```
JSON.TOGGLE <key> [path] 
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de inteiros (0 - falso, 1 - verdadeiro) que representam o valor booleano resultante em cada caminho.
+ Se um valor for um não booleano, seu valor de retorno correspondente será null.
+ `NONEXISTENT` se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ String (“verdadeiro”/“falso”) que representa o valor booleano resultante.
+ `NONEXISTENT` se a chave do documento não existir.
+ Erro `WRONGTYPE` se o valor no caminho não for um valor booleano.

**Exemplos**

 Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":true, "b":false, "c":1, "d":null, "e":"foo", "f":[], "g":{}}'
OK
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 0
2) (integer) 1
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 1
2) (integer) 0
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
```

 Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . true
OK
127.0.0.1:6379> JSON.TOGGLE k1
"false"
127.0.0.1:6379> JSON.TOGGLE k1
"true"

127.0.0.1:6379> JSON.SET k2 . '{"isAvailable": false}'
OK
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"true"
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"false"
```

# JSON.TYPE
<a name="json-type"></a>

Informa tipo de valores em um determinado caminho.

Sintaxe

```
JSON.TYPE <key> [path]
```
+ key (obrigatório): chave do tipo de documento JSON
+ path (opcional): um caminho JSON. Assumirá o padrão da raiz se não for fornecido

**Return**

Se o caminho for uma sintaxe aprimorada:
+ Matriz de strings, que representa o tipo de valor em cada caminho. O tipo é um destes \$1"null”, “boolean”, “string”, “number”, “integer”, “object” e “array"\$1.
+ Se um caminho não existir, seu valor de retorno correspondente será nulo.
+ Matriz vazia se a chave do documento não existir.

Se o caminho for uma sintaxe restrita:
+ String, tipo do valor
+ Nulo se a chave do documento não existir.
+ Nulo se o caminho JSON for inválido ou não existir.

**Exemplos**

Sintaxe do caminho aprimorada:

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, []]'
OK
127.0.0.1:6379> JSON.TYPE k1 $[*]
1) integer
2) number
3) string
4) boolean
5) null
6) object
7) array
```

Sintaxe do caminho restrita:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.TYPE k1
object
127.0.0.1:6379> JSON.TYPE k1 .children
array
127.0.0.1:6379> JSON.TYPE k1 .firstName
string
127.0.0.1:6379> JSON.TYPE k1 .age
integer
127.0.0.1:6379> JSON.TYPE k1 .weight
number
127.0.0.1:6379> JSON.TYPE k1 .isAlive
boolean
127.0.0.1:6379> JSON.TYPE k1 .spouse
null
```