

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mulai menggunakan JSON
<a name="json-gs"></a>

MemoryDB mendukung format asli JavaScript Object Notation (JSON), cara sederhana dan tanpa skema untuk menyandikan kumpulan data kompleks di dalam cluster Valkey atau Redis OSS. Anda dapat menyimpan dan mengakses data secara native menggunakan format JavaScript Object Notation (JSON) di dalam cluster dan memperbarui data JSON yang disimpan dalam cluster tersebut, tanpa perlu mengelola kode khusus untuk membuat serial dan deserialisasinya.

Selain memanfaatkan Valkey atau Redis OSS APIs untuk aplikasi yang beroperasi melalui JSON, Anda sekarang dapat secara efisien mengambil dan memperbarui bagian tertentu dari dokumen JSON tanpa perlu memanipulasi seluruh objek, yang dapat meningkatkan kinerja dan mengurangi biaya. Anda juga dapat menelusuri konten dokumen JSON Anda menggunakan kueri `JSONPath` [bergaya Goessner](https://goessner.net/articles/JsonPath/).

Setelah membuat cluster dengan versi mesin yang didukung, tipe data JSON dan perintah terkait secara otomatis tersedia. Ini kompatibel dengan API dan kompatibel dengan RDB dengan versi 2 dari modul RedisJSON, sehingga Anda dapat dengan mudah memigrasikan aplikasi Valkey atau Redis OSS berbasis JSON yang ada ke MemoryDB. Untuk informasi selengkapnya tentang perintah yang didukung, lihat[Perintah yang Didukung](json-list-commands.md).

Metrik terkait JSON `JsonBasedCmds` dimasukkan ke dalam CloudWatch untuk memantau penggunaan tipe data ini. Untuk informasi selengkapnya, lihat [Metrik untuk MemoryDB](https://docs.aws.amazon.com/memorydb/latest/devguide/metrics.memorydb.html).

**catatan**  
Untuk menggunakan JSON, Anda harus menjalankan Valkey 7.2 atau yang lebih baru, atau mesin Redis OSS versi 6.2.6 atau yang lebih baru.

**Topics**
+ [Ikhtisar JSON Datatype](json-document-overview.md)
+ [Perintah yang Didukung](json-list-commands.md)

# Ikhtisar JSON Datatype
<a name="json-document-overview"></a>

MemoryDB mendukung sejumlah perintah Valkey dan Redis OSS untuk bekerja dengan tipe data JSON. Berikut ini adalah ikhtisar tipe data JSON dan daftar rinci perintah yang didukung.

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


****  

| Istilah | Deskripsi | 
| --- | --- | 
|  Dokumen JSON | mengacu pada nilai kunci JSON | 
|  Nilai JSON | mengacu pada subset dari Dokumen JSON, termasuk root yang mewakili seluruh dokumen. Nilai bisa berupa wadah atau entri dalam wadah | 
|  Elemen JSON | setara dengan nilai JSON | 

## Standar JSON yang didukung
<a name="Supported-JSON-Standard"></a>

Format JSON sesuai dengan standar pertukaran data JSON [RFC 7159](https://www.ietf.org/rfc/rfc7159.txt) dan [ECMA-404](https://www.ietf.org/rfc/rfc7159.txt). Mendukung UTF-8 [Unicode](https://www.unicode.org/standard/WhatIsUnicode.html) pada teks JSON.

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

Elemen root dapat berupa jenis data JSON apa pun. Perhatikan bahwa di RFC 4627 sebelumnya, hanya objek atau array yang diizinkan sebagai nilai root. Sejak pembaruan ke RFC 7159, root dokumen JSON dapat berupa jenis data JSON apa pun.

## Batas ukuran dokumen
<a name="json-document-size-limit"></a>

Dokumen JSON disimpan secara internal dalam format yang dioptimalkan untuk akses cepat dan modifikasi. Format ini biasanya menghasilkan lebih banyak memori daripada representasi serial yang setara dari dokumen yang sama. Konsumsi memori oleh satu dokumen JSON dibatasi hingga 64MB, yang merupakan ukuran struktur data dalam memori, bukan string JSON. Jumlah memori yang dikonsumsi oleh dokumen JSON dapat diperiksa dengan menggunakan perintah. `JSON.DEBUG MEMORY`

## JSON ACLs
<a name="json-acls"></a>
+ Jenis data JSON sepenuhnya terintegrasi ke dalam kemampuan Valkey dan Redis OSS [Access](https://valkey.io/topics/acl/) Control Lists (ACL). Mirip dengan kategori per-tipe data yang ada (@string, @hash, dll.) Kategori baru @json ditambahkan untuk menyederhanakan pengelolaan akses ke perintah dan data JSON. Tidak ada perintah Valkey atau Redis OSS lain yang ada sebagai anggota kategori @json. Semua perintah JSON memberlakukan batasan dan izin ruang kunci atau perintah apa pun.
+ Ada lima kategori ACL yang ada yang diperbarui untuk menyertakan perintah JSON baru: @read, @write, @fast, @slow dan @admin. Tabel di bawah ini menunjukkan pemetaan perintah JSON ke kategori yang sesuai.


**ACL**  

| Perintah 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 |  |  | 

## Batas kedalaman sarang
<a name="json-nesting-depth-limit"></a>

Ketika objek atau array JSON memiliki elemen yang merupakan objek atau array JSON lain, objek dalam atau array dianggap "bersarang" dalam objek luar atau array. Batas kedalaman sarang maksimum adalah 128. Setiap percobaan untuk membuat dokumen yang berisi kedalaman bersarang lebih dari 128 akan ditolak dengan kesalahan.

## Sintaksis perintah
<a name="json-command-syntax"></a>

Kebanyakan perintah memerlukan nama kunci Valkey atau Redis OSS sebagai argumen pertama. Beberapa perintah juga memiliki argumen jalur. Argumen path default ke root jika opsional dan tidak disediakan.

 Notasi:
+ Argumen yang diperlukan terlampir dalam tanda kurung sudut, mis. <key>
+ Argumen opsional terlampir dalam tanda kurung siku, misalnya [path]
+ Argumen opsional tambahan ditunjukkan oleh..., misalnya [json...]

## Sintaksis jalur
<a name="json-path-syntax"></a>

JSON untuk Valkey dan Redis OSS mendukung dua jenis sintaks jalur:
+ **Sintaks yang disempurnakan** - Mengikuti JSONPath sintaks yang dijelaskan oleh [Goessner](https://goessner.net/articles/JsonPath/), seperti yang ditunjukkan pada tabel di bawah ini. Kami telah menyusun ulang dan mengubah deskripsi dalam tabel agar jelas.
+ **Sintaksis terbatas** – Memiliki kemampuan kueri terbatas.

**catatan**  
Hasil dari beberapa perintah sensitif jenis sintaks jalur yang digunakan.

 Jika jalur kueri diawali dengan '\$1', kueri tersebut menunjukkan penggunaan sintaksis yang ditingkatkan. Jika tidak, maka kueri tersebut menggunakan sintaksis terbatas.

**Sintaks yang Ditingkatkan**


****  

| Simbol/Ekspresi | Deskripsi | 
| --- | --- | 
|  \$1 | elemen root | 
|  . atau [] | operator anak | 
|  .. | keturunan rekursif | 
|  \$1 | wildcard. Semua elemen dalam sebuah objek atau array. | 
|  [] | operator subskrip array. Indeks berbasis 0. | 
|  [,] | operator serikat | 
|  [start:end:step] | operator irisan array | 
|  ?() | menerapkan ekspresi filter (script) ke array atau objek saat ini | 
|  () | ekspresi filter | 
|  @ | digunakan dalam ekspresi filter mengacu pada node saat ini sedang diproses | 
|  == | sama dengan, digunakan dalam ekspresi filter. | 
|  \$1= | tidak sama dengan, digunakan dalam ekspresi filter. | 
|  > | lebih besar dari, digunakan dalam ekspresi filter. | 
|  >= | lebih besar dari atau sama dengan, digunakan dalam ekspresi filter.  | 
|  < | kurang dari, digunakan dalam ekspresi filter. | 
|  <= | kurang dari atau sama dengan, digunakan dalam ekspresi filter.  | 
|  && | logis AND, digunakan untuk menggabungkan beberapa ekspresi filter. | 
|  \$1\$1 | logis OR, digunakan untuk menggabungkan beberapa ekspresi filter. | 

**Contoh**

Contoh di bawah ini dibangun di atas contoh data XHTML [Goessner](https://goessner.net/articles/JsonPath/), yang telah kami modifikasi dengan menambahkan bidang tambahan.

```
{ "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
    }
  }
}
```


****  

| Jalan | Deskripsi | 
| --- | --- | 
|  \$1.store.book[\$1].author | penulis semua buku di toko | 
|  \$1..author | semua penulis | 
|  \$1.store.\$1 | semua anggota toko | 
|  \$1["store"].\$1 | semua anggota toko | 
|  \$1.store..price | harga semua yang ada di toko | 
|  \$1..\$1 | semua anggota rekursif dari struktur JSON | 
|  \$1..book[\$1] | semua buku | 
|  \$1..book[0] | buku pertama | 
|  \$1..book[-1] | buku terakhir | 
|  \$1..book[0:2] | Dua buku pertama | 
|  \$1..book[0,1] | Dua buku pertama | 
|  \$1..book[0:4] | buku dari indeks 0 hingga 3 (indeks akhir tidak inklusif) | 
|  \$1..book[0:4:2] | buku pada indeks 0, 2 | 
|  \$1..book[?(@.isbn)] | semua buku dengan nomor isbn | 
|  \$1..book[?(@.price<10)] | Semua buku lebih murah dari \$110 | 
|  ‘\$1..book[?(@.price < 10)]’ | Semua buku lebih murah dari \$110. (Jalur harus dikutip jika berisi spasi putih) | 
|  ‘\$1..book[?(@.["price"] < 10)]’ | Semua buku lebih murah dari \$110 | 
|  '\$1..book[?(@.["price"] < 10)]' | Semua buku lebih murah dari \$110 | 
|  \$1..book[?(@.price>=10&&@.price<=100)] | semua buku dalam kisaran harga \$110 hingga \$1100, inklusif | 
|  '\$1..book[?(@.price>=10 && @.price<=100)]' | semua buku dalam kisaran harga \$110 hingga \$1100, inklusif. (Jalur harus dikutip jika berisi spasi putih) | 
|  \$1..book[?(@.sold==true\$1\$1@.in-stock==false)] | semua buku terjual atau kehabisan stok | 
|  '\$1..book[?(@.sold == true \$1\$1 @.in-stock == false)]' | Semua buku terjual atau kehabisan stok. (Jalur harus dikutip jika berisi spasi putih) | 
|  '\$1.store.book[?(@.["category"] == "fiction")]' | semua buku dalam kategori fiksi | 
|  '\$1.store.book[?(@.["category"] \$1= "fiction")]' | semua buku dalam kategori non-fiksi | 

Contoh ekspresi filter lainnya:

```
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]"
```

**Sintaksis terbatas**


****  

| Simbol/Ekspresi | Deskripsi | 
| --- | --- | 
|  . atau [] | operator anak | 
|  [] | operator subskrip array. Indeks berbasis 0. | 

**Contoh**


****  

| Jalur | Deskripsi | 
| --- | --- | 
|  .store.book[0].author | penulis buku pertama | 
|  .store.book[-1].author | penulis buku terakhir | 
|  .address.city | nama kota | 
|  ["store"]["book"][0]["title"] | Judul buku pertama | 
|  ["store"]["book"][-1]["title"] | Judul buku terakhir | 

**catatan**  
Semua konten [Goessner](https://goessner.net/articles/JsonPath/) yang dikutip dalam dokumentasi ini diatur dengan [Lisensi Creative Commons](https://creativecommons.org/licenses/by/2.5/).

## Awalan kesalahan umum
<a name="json-error-prefixes"></a>

Setiap pesan kesalahan memiliki awalan. Berikut ini adalah daftar awalan kesalahan umum:


****  

| Awalan | Deskripsi | 
| --- | --- | 
|  ERR | kesalahan umum | 
|  LIMIT | batas ukuran melebihi kesalahan. misalnya, batas ukuran dokumen atau batas kedalaman bersarang terlampaui | 
|  NONEXISTENT | kunci atau jalur tidak ada | 
|  OUTOFBOUNDARIES | indeks array di luar batas | 
|  SYNTAXERR | kesalahan sintaks | 
|  WRONGTYPE | jenis nilai yang salah | 

## Metrik terkait JSON
<a name="json-info-metrics"></a>

Tersedia metrik info JSON berikut:


****  

| Info | Deskripsi | 
| --- | --- | 
|  json\$1total\$1memory\$1bytes | total memori yang dialokasikan ke objek JSON | 
|  json\$1num\$1documents | jumlah total dokumen di mesin Valkey atau Redis OSS | 

Untuk menanyakan metrik inti, jalankan perintah:

```
info json_core_metrics
```

## Bagaimana MemoryDB berinteraksi dengan JSON
<a name="json-differences"></a>

Berikut ini menggambarkan bagaimana MemoryDB berinteraksi dengan tipe data JSON.

### Prasyarat operator
<a name="json-operator-precedence"></a>

Saat mengevaluasi ekspresi bersyarat untuk pemfilteran, &&s diutamakan terlebih dahulu, lalu \$1\$1s dievaluasi, seperti yang umum di sebagian besar bahasa. Operasi di dalam tanda kurung akan dieksekusi terlebih dahulu. 

### Perilaku batas bersarang jalur maksimum
<a name="json-max-path"></a>

Batas bersarang jalur maksimum MemoryDB adalah 128. Jadi nilai seperti `$.a.b.c.d...` hanya bisa mencapai 128 tingkat. 

### Menangani nilai numerik
<a name="json-about-numbers"></a>

JSON tidak memiliki tipe data terpisah untuk bilangan bulat dan floating point. Semuanya disebut angka.

Ketika nomor JSON diterima, itu disimpan dalam salah satu dari dua format. Jika nomor cocok dengan integer bertanda 64-bit, maka itu dikonversi ke format itu; jika tidak, itu disimpan sebagai string. Operasi aritmatika pada dua nomor JSON (misalnya JSON.NUMINCRBY dan JSON.NUMMULTBY) berusaha mempertahankan presisi sebanyak mungkin. Jika dua operan dan nilai yang dihasilkan cocok dengan integer bertanda 64-bit, maka aritmatika integer dilakukan. Jika tidak, operan input diubah menjadi nomor floating point presisi ganda IEEE 64-bit, operasi aritmatika dilakukan, dan hasilnya diubah kembali menjadi string.

Perintah aritmetika `NUMINCRBY` dan `NUMMULTBY`:
+ Jika kedua angka adalah bilangan bulat, dan hasilnya berada di luar kisaran int64, secara otomatis akan menjadi nomor floating point presisi ganda.
+ Jika setidaknya salah satu angka adalah floating point, hasilnya akan menjadi nomor floating point presisi ganda.
+ Jika hasilnya melebihi kisaran ganda, perintah akan mengembalikan `OVERFLOW` kesalahan.

**catatan**  
Sebelum mesin Redis OSS versi 6.2.6.R2 ketika nomor JSON diterima pada input, itu diubah menjadi salah satu dari dua representasi biner internal: integer bertanda 64-bit atau titik mengambang presisi ganda IEEE 64-bit. String asli dan semua formatnya tidak dipertahankan. Jadi, ketika angka dihasilkan sebagai bagian dari respons JSON, angka tersebut dikonversi dari representasi biner internal ke string yang dapat dicetak yang menggunakan aturan pemformatan generik. Aturan-aturan ini dapat menghasilkan string yang berbeda dari string yang diterima.  
Jika kedua angka ini adalah integer dan hasilnya berada di luar rentang `int64`, maka angka tersebut secara otomatis akan menjadi angka floating point presisi ganda IEEE 64-bit.
Jika minimal salah satu angkanya adalah floating point, hasilnya adalah angka floating point presisi ganda IEEE 64-bit.
Jika hasilnya melebihi rentang IEEE 64-bit ganda, perintah ini menampilkan kesalahan `OVERFLOW`.

Untuk daftar lengkap perintah yang tersedia, lihat [Perintah yang Didukung](json-list-commands.md).

### Evaluasi sintaksis yang ketat
<a name="json-strict-syntax-evaluation"></a>

MemoryDB tidak mengizinkan jalur JSON dengan sintaksis yang tidak valid, bahkan jika subset dari jalur berisi jalur yang valid. Hal ini dimaksudkan untuk menjaga perilaku yang benar bagi pelanggan kami.

# Perintah yang Didukung
<a name="json-list-commands"></a>

Perintah JSON berikut didukung:

**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>

Tambahkan satu atau lebih nilai ke nilai array di jalur.

Sintaksis

```
JSON.ARRAPPEND <key> <path> <json> [json ...]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ jalur (diperlukan) - jalur JSON
+ json (wajib) - nilai JSON yang akan ditambahkan ke array

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat, mewakili panjang baru dari array di setiap jalur.
+ Jika nilai bukan array, nilai yang akan dikembalikan adalah kosong.
+ Kesalahan `SYNTAXERR` jika salah satu argumen input json bukan string JSON yang valid.
+ Kesalahan `NONEXISTENT` jika jalur tidak ada.

Jika jalur adalah sintaksis terbatas:
+ Integer, panjang baru array.
+ Jika memilih beberapa nilai array, perintah ini mengembalikan panjang baru dari array yang terakhir diperbarui.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan array.
+ Kesalahan `SYNTAXERR` jika salah satu argumen input json bukan string JSON yang valid.
+ Kesalahan `NONEXISTENT` jika jalur tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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\"]]"
```

 Sintaksis jalur terbatas:

```
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>

Cari kejadian pertama dari nilai JSON skalar dalam array di jalur.
+ Kesalahan di luar jangkauan diatasi dengan membulatkan indeks ke awal dan akhir array.
+ Jika awal > akhir, mengembalikan -1 (tidak ditemukan).

Sintaksis

```
JSON.ARRINDEX <key> <path> <json-scalar> [start [end]]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ jalur (diperlukan) - jalur JSON
+ json-scalar (wajib) — nilai skalar untuk dicari; Skalar JSON mengacu pada nilai yang bukan objek atau array. yaitu, String, number, boolean dan null adalah nilai skalar.
+ mulai (opsional) - indeks mulai, inklusif. Default ke 0 jika tidak disediakan.
+ akhir (opsional) - indeks akhir, eksklusif. Default ke 0 jika tidak disediakan, yang berarti elemen terakhir disertakan. 0 atau -1 berarti elemen terakhir disertakan.

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array integer. Setiap nilai adalah indeks dari elemen yang cocok dalam array di jalur. Nilainya -1 jika tidak ditemukan.
+ Jika nilai bukan array, nilai yang akan dikembalikan adalah kosong.

Jika jalur adalah sintaksis terbatas:
+ Integer, indeks elemen yang cocok, atau -1 jika tidak ditemukan.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan array.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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
```

 Sintaksis jalur terbatas:

```
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>

Masukkan satu atau lebih nilai ke dalam nilai array di jalur sebelum indeks.

Sintaksis

```
JSON.ARRINSERT <key> <path> <index> <json> [json ...]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ jalur (diperlukan) - jalur JSON
+ index (required) — indeks array sebelum nilai yang dimasukkan.
+ json (wajib) - nilai JSON yang akan ditambahkan ke array

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat, mewakili panjang baru dari array di setiap jalur.
+ Jika nilai adalah array kosong, nilai yang akan dikembalikan adalah kosong.
+ Jika nilai bukan array, nilai yang akan dikembalikan adalah kosong.
+ Kesalahan `OUTOFBOUNDARIES` jika argumen indeks di luar batas.

Jika jalur adalah sintaksis terbatas:
+ Integer, panjang baru array.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan array.
+ Kesalahan `OUTOFBOUNDARIES` jika argumen indeks di luar batas.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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\"]]"
```

 Sintaksis jalur terbatas:

```
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>

Dapatkan panjang nilai array di jalur.

Sintaksis

```
JSON.ARRLEN <key> [path] 
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat, mewakili panjang array di setiap jalur.
+ Jika nilai bukan array, nilai yang akan dikembalikan adalah kosong.
+ Kosong jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ Array string massal. Setiap elemen adalah nama kunci dalam objek.
+ Integer, panjang array.
+ Jika memilih beberapa objek, perintah ini mengembalikan panjang array pertama.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan array.
+ Kesalahan `WRONGTYPE` jika jalur tidak ada.
+ Kosong jika kunci dokumen tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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)
```

 Sintaksis jalur terbatas:

```
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>

Hapus dan kembalikan elemen pada indeks dari array. Popping array kosong akan menampilkan null.

Sintaksis

```
JSON.ARRPOP <key> [path [index]]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan
+ index (opsional) — posisi dalam array untuk mulai muncul dari.
  + Default ke -1 jika tidak disediakan, yang berarti elemen terakhir.
  + Nilai negatif berarti posisi dari elemen terakhir.
  + Indeks di luar batas akan dibulatkan ke batas array masing-masing.

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array string massal, mewakili nilai yang muncul di setiap jalur.
+ Jika nilai adalah array kosong, nilai yang akan dikembalikan adalah kosong.
+ Jika nilai bukan array, nilai yang akan dikembalikan adalah kosong.

Jika jalur adalah sintaksis terbatas:
+ String massal, mewakili nilai JSON yang muncul
+ Null jika array kosong.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan array.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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\"]]"
```

 Sintaksis jalur terbatas:

```
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>

Potong array di jalur sehingga menjadi subarray [start, end], keduanya inklusif.
+ Jika array kosong, tidak melakukan apa pun, mengembalikan 0.
+ Jika awal <0, perlakukan itu sebagai 0.
+ Jika akhir >= ukuran (ukuran array), perlakukan itu sebagai ukuran-1.
+ Jika awal >= ukuran atau awal > akhir, mengosongkan array dan menampilkan 0.

Sintaksis

```
JSON.ARRINSERT <key> <path> <start> <end>
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ jalur (diperlukan) - jalur JSON
+ mulai (wajib) - indeks mulai, inklusif.
+ akhir (wajib) - indeks akhir, inklusif.

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat, mewakili panjang baru dari array di setiap jalur.
+ Jika nilai adalah array kosong, nilai yang akan dikembalikan adalah kosong.
+ Jika nilai bukan array, nilai yang akan dikembalikan adalah kosong.
+ Kesalahan `OUTOFBOUNDARIES` jika argumen indeks di luar batas.

Jika jalur adalah sintaksis terbatas:
+ Integer, panjang baru array.
+ Null jika array kosong.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan array.
+ Kesalahan `OUTOFBOUNDARIES` jika argumen indeks di luar batas.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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\"]]"
```

 Sintaksis jalur terbatas:

```
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>

Bersihkan array atau objek di jalan.

Sintaksis

```
JSON.CLEAR <key> [path]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**
+ Integer, jumlah kontainer dihapus.
+ Menghapus array kosong atau akun objek untuk 0 kontainer dihapus.
**catatan**  
Sebelum Redis OSS versi 6.2.6.R2, membersihkan array kosong atau akun objek untuk 1 kontainer dihapus.
+ Menghapus nilai non-kontainer mengembalikan 0.
+ Jika tidak ada array atau nilai objek terletak di jalan, perintah mengembalikan 0.

**Contoh**

```
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>

Laporkan informasi. Subperintah yang didukung adalah:
+ MEMORY <key>[path] — melaporkan penggunaan memori dalam byte dari nilai JSON. Jalur akan diatur secara default ke root jika tidak disediakan.
+ <key>DEPTH [path] — Melaporkan kedalaman jalur maksimum dokumen JSON.
**catatan**  
Subperintah ini hanya tersedia menggunakan Valkey 7.2 atau yang lebih baru, atau mesin Redis OSS versi 6.2.6.R2 atau yang lebih baru.
+ FIELDS <key>[path] — laporkan jumlah bidang di jalur dokumen yang ditentukan. Jalur akan diatur secara default ke root jika tidak disediakan. Setiap nilai JSON non-kontainer dihitung sebagai satu bidang. Objek dan array secara rekursif menghitung satu bidang untuk masing-masing nilai JSON. Setiap nilai kontainer, kecuali kontainer root, dihitung sebagai satu bidang tambahan.
+ BANTUAN — cetak pesan bantuan dari perintah.

Sintaksis

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

Tergantung pada subperintah:

MEMORY
+ Jika jalur adalah sintaksis yang ditingkatkan:
  + mengembalikan array bilangan bulat, mewakili ukuran memori (dalam byte) dari nilai JSON di setiap jalur.
  + mengembalikan array kosong jika kunci tidak ada.
+ Jika jalur adalah sintaksis terbatas:
  + mengembalikan integer, ukuran memori nilai JSON dalam byte.
  + mengembalikan null jika kunci tidak ada.

KEDALAMAN
+ Mengembalikan integer yang mewakili kedalaman jalur maksimum dokumen JSON.
+ Mengembalikan null jika kunci tidak ada.

FIELD
+ Jika jalur adalah sintaksis yang ditingkatkan:
  + mengembalikan array bilangan bulat, mewakili jumlah bidang nilai JSON di setiap jalur.
  + mengembalikan array kosong jika kunci tidak ada.
+ Jika jalur adalah sintaksis terbatas:
  + mengembalikan integer, jumlah bidang nilai JSON.
  + mengembalikan null jika kunci tidak ada.

HELP — mengembalikan array pesan bantuan.

**Contoh**

Sintaksis jalur yang ditingkatkan:

```
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
```

Sintaksis jalur terbatas:

```
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>

Hapus nilai JSON di jalur dalam kunci dokumen. Jika jalurnya adalah root, itu setara dengan menghapus kunci dari Valkey atau Redis OSS.

Sintaksis

```
JSON.DEL <key> [path]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**
+ Jumlah elemen yang dihapus.
+ 0 jika kuncinya tidak ada.
+ 0 jika jalur JSON tidak valid atau tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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\":[]}"
```

 Sintaksis jalur terbatas:

```
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>

Sebuah alias dari [JSON.DEL](json-del.md)

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

Kembalikan JSON serial pada satu atau beberapa jalur.

Sintaksis

```
JSON.GET <key>
[INDENT indentation-string]
[NEWLINE newline-string]
[SPACE space-string]
[NOESCAPE]
[path ...]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ INDENT/NEWLINE/SPACE(opsional) — mengontrol format string JSON yang dikembalikan, yaitu, “cetak cantik”. Nilai default masing-masing adalah string kosong. Mereka dapat diganti dalam kombinasi apa pun. Nilai dapat ditentukan dalam urutan apa pun.
+ NOESCAPE - opsional, diizinkan hadir untuk kompatibilitas lama dan tidak memiliki efek lain.
+ path (opsional) — nol atau lebih jalur JSON, default ke root jika tidak ada yang diberikan. Argumen jalur harus ditempatkan di akhir.

**Nilai yang ditampilkan**

Sintaksis jalur yang ditingkatkan:

 Jika disediakan satu jalur:
+ Kembalikan string serial dari array nilai.
+ Jika tidak ada nilai yang dipilih, perintah ini mengembalikan array kosong.

 Jika beberapa jalur diberikan:
+ Kembalikan objek JSON dirangkai, di mana setiap jalur adalah kunci.
+ Jika terdapat campuran sintaksis jalur yang ditingkatkan dan dibatasi, hasilnya sesuai dengan sintaksis yang ditingkatkan.
+ Jika jalur tidak ada, nilai yang sesuai adalah array kosong.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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]"
```

 Sintaksis jalur terbatas:

```
 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>

Dapatkan serial JSONs di jalur dari beberapa kunci dokumen. Kembalikan null untuk kunci yang tidak ada atau jalur JSON.

Sintaksis

```
JSON.MGET <key> [key ...] <path>
```
+ kunci (wajib) - Satu atau lebih kunci jenis dokumen.
+ jalur (diperlukan) - jalur JSON

**Nilai yang ditampilkan**
+ Array String Massal. Ukuran array sama dengan jumlah kunci dalam perintah. Setiap elemen array diisi dengan (a) JSON serial seperti yang terletak di jalur atau (b) Null jika kunci tidak ada atau jalur tidak ada dalam dokumen atau jalur tidak valid (kesalahan sintaks).
+ Jika salah satu kunci yang ditentukan ada dan bukan kunci JSON, perintah ini mengembalikan kesalahan `WRONGTYPE`.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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\"]"
```

 Sintaksis jalur terbatas:

```
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>

Naikkan nilai angka di jalur dengan nomor tertentu.

Sintaksis

```
JSON.NUMINCRBY <key> <path> <number>
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ jalur (diperlukan) - jalur JSON
+ nomor (wajib) — nomor

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array String massal mewakili nilai yang dihasilkan di setiap jalur.
+ Jika nilai bukan angka, nilai yang akan ditampilkan adalah kosong.
+ Kesalahan `WRONGTYPE` jika angka tidak dapat diuraikan.
+ Kesalahan `OVERFLOW` jika hasilnya di luar rentang double 64-bit IEEE.
+ `NONEXISTENT` jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ String Massal mewakili nilai yang dihasilkan.
+ Jika memilih beberapa nilai, perintah ini mengembalikan hasil nilai yang terakhir diperbarui.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan angka.
+ Kesalahan `WRONGTYPE` jika angka tidak dapat diuraikan.
+ Kesalahan `OVERFLOW` jika hasilnya di luar rentang double 64-bit IEEE.
+ `NONEXISTENT` jika kunci dokumen tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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}}"
```

 Sintaksis jalur terbatas:

```
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>

Lipat gandakan nilai angka di jalur dengan angka tertentu.

Sintaksis

```
JSON.NUMMULTBY <key> <path> <number>
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ jalur (diperlukan) - jalur JSON
+ nomor (wajib) — nomor

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array String massal mewakili nilai yang dihasilkan di setiap jalur.
+ Jika nilai bukan angka, nilai yang akan ditampilkan adalah kosong.
+ Kesalahan `WRONGTYPE` jika angka tidak dapat diuraikan.
+ Kesalahan `OVERFLOW` jika hasilnya di luar rentang double 64-bit IEEE.
+ `NONEXISTENT` jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ String Massal mewakili nilai yang dihasilkan.
+ Jika memilih beberapa nilai, perintah ini mengembalikan hasil nilai yang terakhir diperbarui.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan angka.
+ Kesalahan `WRONGTYPE` jika angka tidak dapat diuraikan.
+ Kesalahan `OVERFLOW` jika hasilnya di luar rentang double 64-bit IEEE.
+ `NONEXISTENT` jika kunci dokumen tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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]"
```

 Sintaksis jalur terbatas:

```
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>

Dapatkan jumlah kunci dalam nilai objek di jalur.

Sintaksis

```
JSON.OBJLEN <key> [path]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat, mewakili panjang objek di setiap jalur.
+ Jika nilai bukan objek, nilai yang akan dikembalikan adalah nilai yang kosong.
+ Kosong jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ Integer, jumlah kunci dalam objek.
+ Jika memilih beberapa objek, perintah ini mengembalikan panjang objek pertama.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan objek.
+ Kesalahan `WRONGTYPE` jika jalur tidak ada.
+ Kosong jika kunci dokumen tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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)
```

 Sintaksis jalur terbatas:

```
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>

Dapatkan nama kunci dalam nilai objek di jalur.

Sintaksis

```
JSON.OBJKEYS <key> [path]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array string massal. Setiap elemen adalah array kunci dalam objek yang cocok.
+ Jika nilai bukan objek, nilai yang akan dikembalikan adalah nilai yang kosong.
+ Kosong jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ Array string massal. Setiap elemen adalah nama kunci dalam objek.
+ Jika memilih beberapa objek, perintah ini mengembalikan kunci objek pertama.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan objek.
+ Kesalahan `WRONGTYPE` jika jalur tidak ada.
+ Kosong jika kunci dokumen tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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"
```

 Sintaksis jalur terbatas:

```
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>

Kembalikan nilai JSON di jalur yang diberikan di Valkey atau Redis OSS Serialization Protocol (RESP). Jika nilainya adalah wadah, responsnya adalah array RESP atau array bersarang.
+ JSON kosong dipetakan ke String Massal Kosong RESP.
+ Nilai boolean JSON dipetakan ke masing-masing Resp Simple Strings.
+ Angka integer dipetakan ke Integer RESP.
+ Nomor floating point ganda IEEE 64-bit dipetakan ke String Massal RESP.
+ String JSON dipetakan ke Resp Bulk Strings.
+ Array JSON direpresentasikan sebagai Array RESP, di mana elemen pertama adalah string sederhana [, diikuti oleh elemen array.
+ Objek JSON direpresentasikan sebagai Array RESP, di mana elemen pertama adalah string sederhana \$1, diikuti oleh pasangan kunci-nilai, yang masing-masing adalah string massal RESP.

Sintaksis

```
JSON.RESP <key> [path]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array dari array. Setiap elemen array merepresentasikan bentuk RESP dari nilai pada satu jalur.
+ Array kosong jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ Array, mewakili bentuk RESP dari nilai di jalur.
+ Kosong jika kunci dokumen tidak ada.

**Contoh**

Sintaksis jalur yang ditingkatkan:

```
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"
```

Sintaksis jalur terbatas:

```
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>

Tetapkan nilai JSON di jalur.

Jika jalur memanggil anggota objek:
+ Jika elemen induk tidak ada, perintah akan mengembalikan kesalahan NONEXISTENT.
+ Jika elemen induk ada tetapi bukan objek, perintah akan mengembalikan ERROR.
+ Jika elemen induk ada dan merupakan objek:
  +  Jika anggota tidak ada, anggota baru akan ditambahkan ke objek induk jika dan hanya jika objek induk adalah turunan terakhir di jalur. Jika tidak, perintah akan mengembalikan kesalahan NONEXISTENT.
  +  Jika anggota ada, nilainya akan diganti dengan nilai JSON.

Jika jalur memanggil indeks array:
+ Jika elemen induk tidak ada, perintah akan mengembalikan kesalahan NONEXISTENT.
+ Jika elemen induk ada tetapi bukan array, perintah akan mengembalikan ERROR.
+ Jika elemen induk ada tetapi indeks di luar batas, perintah akan mengembalikan kesalahan OUTOFBORDIES.
+ Jika elemen induk ada dan indeks valid, elemen akan diganti dengan nilai JSON baru.

Jika jalur memanggil objek atau array, nilai (objek atau array) akan digantikan oleh nilai JSON baru.

Sintaksis

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

[NX \$1 XX] Di mana Anda dapat memiliki 0 atau 1 pengidentifikasi [NX \$1 XX]
+ kunci (wajib) - kunci jenis dokumen JSON
+ jalur (diperlukan) - jalur JSON. Untuk kunci baru, jalur JSON harus menjadi root “.”.
+ NX (opsional) - Jika jalurnya adalah root, atur nilainya hanya jika kuncinya tidak ada, yaitu menyisipkan dokumen baru. Jika jalur bukan root, atur nilainya hanya jika jalur tidak ada, yaitu, masukkan nilai ke dalam dokumen.
+ XX (opsional) - Jika jalurnya adalah root, tetapkan nilainya hanya jika kuncinya ada, yaitu mengganti dokumen yang ada. Jika jalur bukan root, tetapkan nilainya hanya jika jalur ada, yaitu, perbarui nilai yang ada.

**Nilai yang ditampilkan**
+ String sederhana 'OK' jika berhasil.
+ Kosong jika kondisi NX atau XX tidak terpenuhi.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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]}"
```

 Sintaksis jalur terbatas:

```
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>

Tambahkan string ke string JSON di jalur.

Sintaksis

```
JSON.STRAPPEND <key> [path] <json_string>
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan
+ json\$1string (wajib) - representasi JSON dari string. Perhatikan bahwa string JSON harus dikutip, yaitu, '"foo"'.

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat, mewakili panjang baru string di setiap jalur.
+ Jika nilai di jalur bukan string, nilai yang akan dikembalikan adalah kosong.
+ `SYNTAXERR `kesalahan jika argumen input json bukan string JSON yang valid.
+ `NONEXISTENT `kesalahan jika jalur tidak ada.

Jika jalur adalah sintaksis terbatas:
+ Integer, panjang baru string.
+ Jika memilih beberapa nilai string, perintah ini mengembalikan panjang baru dari string yang terakhir diperbarui.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan string.
+ Kesalahan `WRONGTYPE` jika argumen input json bukan string JSON yang valid.
+ Kesalahan `NONEXISTENT` jika jalur tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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)
```

 Sintaksis jalur terbatas:

```
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>

Dapatkan panjang nilai string JSON di jalur.

Sintaksis

```
JSON.STRLEN <key> [path] 
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat, mewakili panjang nilai string di setiap jalur.
+ Jika nilai bukan string, nilai yang akan dikembalikan adalah kosong.
+ Kosong jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ Integer, panjang string.
+ Jika memilih beberapa nilai string, perintah ini mengembalikan panjang string pertama.
+ Kesalahan `WRONGTYPE` jika nilai di jalur bukan string.
+ Kesalahan `NONEXISTENT` jika jalur tidak ada.
+ Kosong jika kunci dokumen tidak ada.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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)
```

 Sintaksis jalur terbatas:

```
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>

Alihkan nilai boolean antara true dan false di jalur.

Sintaksis

```
JSON.TOGGLE <key> [path] 
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array bilangan bulat (0 - false, 1 - true) mewakili nilai boolean yang dihasilkan di setiap jalur.
+ Jika nilai bukan boolean, nilai kembalinya yang sesuai adalah null.
+ `NONEXISTENT` jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ String (“true” /"false”) mewakili nilai boolean yang dihasilkan.
+ `NONEXISTENT` jika kunci dokumen tidak ada.
+ `WRONGTYPE`kesalahan jika nilai di jalur bukan boolean.

**Contoh**

 Sintaksis jalur yang ditingkatkan:

```
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)
```

 Sintaksis jalur terbatas:

```
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>

Laporkan jenis nilai di jalur yang diberikan.

Sintaksis

```
JSON.TYPE <key> [path]
```
+ kunci (wajib) - kunci jenis dokumen JSON
+ path (opsional) - jalur JSON. Default ke root jika tidak disediakan

**Nilai yang ditampilkan**

Jika jalur adalah sintaksis yang ditingkatkan:
+ Array string, mewakili jenis nilai di setiap jalur. Jenisnya adalah salah satu dari \$1"null", "boolean", "string", "number", "integer", "object" dan "array"\$1.
+ Jika jalur tidak ada, nilai yang ditampilkan adalah kosong.
+ Array kosong jika kunci dokumen tidak ada.

Jika jalur adalah sintaksis terbatas:
+ String, jenis nilai
+ Kosong jika kunci dokumen tidak ada.
+ Kosong jika jalur JSON tidak valid atau tidak ada.

**Contoh**

Sintaksis jalur yang ditingkatkan:

```
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
```

Sintaksis jalur terbatas:

```
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
```