

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 지원되는 Valkey 및 Redis OSS 명령
<a name="json-list-commands"></a>

ElastiCache는 다음과 같은 Valkey 및 Redis OSS JSON 명령을 지원합니다.

**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.MSET](json-mset.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>

하나 이상의 값을 경로의 배열 값에 추가합니다.

구문

```
JSON.ARRAPPEND <key> <path> <json> [json ...]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다.
+ json(필수) - 배열에 추가할 JSON 값입니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 배열의 새 길이를 나타내는 정수 배열입니다.
+ 값이 배열이 아닌 경우 해당 반환 값은 null입니다.
+ 경로가 존재하지 않는 경우 `NONEXISTENT` 오류가 발생합니다.

경로가 제한된 구문인 경우
+ 정수, 배열의 새 길이.
+ 여러 배열 값을 선택한 경우 명령은 마지막으로 업데이트된 배열의 새 길이를 반환합니다.
+ 경로의 값이 배열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ 입력 json 인수 중 하나가 유효한 JSON 문자열이 아닌 경우 `SYNTAXERR` 오류가 발생합니다.
+ 경로가 존재하지 않는 경우 `NONEXISTENT` 오류가 발생합니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로의 배열에서 처음 나타나는 스칼라 JSON 값을 검색합니다.
+ 범위를 벗어난 오류는 인덱스를 배열의 시작과 끝으로 반올림하여 처리됩니다.
+ 시작 > 끝이면 -1(찾을 수 없음)을 반환합니다.

구문

```
JSON.ARRINDEX <key> <path> <json-scalar> [start [end]]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다.
+ json-scalar(필수) - 검색 대상인 스칼라 값입니다. JSON 스칼라는 객체나 배열이 아닌 값을 참조합니다. 즉, 문자열, 숫자, 부울 및 null은 스칼라 값입니다.
+ 시작(선택 사항) - 시작 인덱스는 포괄적입니다. 제공하지 않으면 기본적으로 0으로 설정됩니다.
+ 끝(선택 사항) - 끝 인덱스는 배타적입니다. 제공되지 않은 경우 기본적으로 0으로 설정됩니다. 즉, 마지막 요소가 포함된다는 의미입니다. 0 또는 -1은 마지막 요소가 포함되었음을 의미합니다.

**반환**

경로가 향상된 구문인 경우
+ 정수 배열입니다. 각 값은 경로에 있는 배열에서 일치하는 요소의 인덱스입니다. 발견되지 않은 경우 값은 -1입니다.
+ 값이 배열이 아닌 경우 해당 반환 값은 null입니다.

경로가 제한된 구문인 경우
+ 정수이며, 일치하는 요소의 인덱스입니다. 또는 찾을 수 없는 경우 -1입니다.
+ 경로의 값이 배열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로의 값 배열에서 인덱스 앞에 하나 이상의 값을 삽입합니다.

구문

```
JSON.ARRINSERT <key> <path> <index> <json> [json ...]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다.
+ 인덱스(필수) - 삽입된 값의 앞에 있는 배열 인덱스입니다.
+ json(필수) - 배열에 추가할 JSON 값입니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 배열의 새 길이를 나타내는 정수 배열입니다.
+ 값이 빈 배열인 경우 해당 반환 값은 null입니다.
+ 값이 배열이 아닌 경우 해당 반환 값은 null입니다.
+ 인덱스 인수가 범위를 벗어난 경우 `OUTOFBOUNDARIES` 오류가 발생합니다.

경로가 제한된 구문인 경우
+ 정수, 배열의 새 길이.
+ 경로의 값이 배열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ 인덱스 인수가 범위를 벗어난 경우 `OUTOFBOUNDARIES` 오류가 발생합니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로에서 배열 값의 길이를 얻습니다.

구문

```
JSON.ARRLEN <key> [path] 
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 배열 길이를 나타내는 정수 배열입니다.
+ 값이 배열이 아닌 경우 해당 반환 값은 null입니다.
+ 문서 키가 없으면 Null입니다.

경로가 제한된 구문인 경우
+ 정수, 배열 길이.
+ 여러 객체를 선택한 경우 명령은 첫 번째 배열의 길이를 반환합니다.
+ 경로의 값이 배열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ `NONEXISTENT JSON`경로가 존재하지 않는 경우 오류가 발생합니다.
+ 문서 키가 없으면 Null입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

```
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 [1] 
(integer) 1 
127.0.0.1:6379> JSON.ARRLEN k1 [2] 
(integer) 2

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] 
(error) WRONGTYPE JSON element is not an array 
127.0.0.1:6379> JSON.ARRLEN k2 [0] 
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k2 [6] 
(error) OUTOFBOUNDARIES Array index is out of bounds
127.0.0.1:6379> JSON.ARRLEN k2 a.b 
(error) NONEXISTENT JSON path does not exist
```

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

배열에서 인덱스의 요소를 제거하고 반환합니다. 빈 배열을 팝하면 null이 반환됩니다.

구문

```
JSON.ARRPOP <key> [path [index]]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 루트로 설정됩니다.
+ 인덱스(선택 사항) - 팝업을 시작할 배열의 위치입니다.
  + 제공되지 않으면 기본적으로 마지막 요소를 의미하는 -1로 설정됩니다.
  + 음수 값은 마지막 요소의 위치를 의미합니다.
  + 경계를 벗어난 인덱스는 각각의 배열 경계로 반올림됩니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 팝된 값을 나타내는 대량 문자열 배열입니다.
+ 값이 빈 배열인 경우 해당 반환 값은 null입니다.
+ 값이 배열이 아닌 경우 해당 반환 값은 null입니다.

경로가 제한된 구문인 경우
+ 대량 문자열, 팝된 JSON 값을 나타냅니다.
+ 배열인 비어 있는 경우 null입니다.
+ 경로의 값이 배열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로의 배열을 자르므로 하위 배열[시작, 끝] 둘 다 포괄적이 됩니다.
+ 배열이 비어 있는 경우 아무 것도 하지 않고 0을 반환합니다.
+ 시작 < 0인 경우 0으로 처리합니다.
+ 끝 >= 크기(배열의 크기)인 경우 크기-1로 처리합니다.
+ 시작 >= 크기 또는 시작 > 끝인 경우 배열을 비우고 0을 반환합니다.

구문

```
JSON.ARRTRIM <key> <path> <start> <end>
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다.
+ 시작(필수) - 시작 인덱스는 포괄적입니다.
+ 끝(필수) - 끝 인텍스, 포괄적입니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 배열의 새 길이를 나타내는 정수 배열입니다.
+ 값이 빈 배열인 경우 해당 반환 값은 null입니다.
+ 값이 배열이 아닌 경우 해당 반환 값은 null입니다.
+ 인덱스 인수가 범위를 벗어난 경우 `OUTOFBOUNDARIES` 오류가 발생합니다.

경로가 제한된 구문인 경우
+ 정수, 배열의 새 길이.
+ 배열인 비어 있는 경우 null입니다.
+ 경로의 값이 배열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ 인덱스 인수가 범위를 벗어난 경우 `OUTOFBOUNDARIES` 오류가 발생합니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로의 배열 또는 객체를 삭제합니다.

구문

```
JSON.CLEAR <key> [path]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**
+ 정수, 삭제된 컨테이너의 수입니다.
+ 삭제된 하나의 컨테이너에 대해 빈 배열 또는 객체 계정을 삭제합니다.
+ 컨테이너가 아닌 값을 삭제하면 0이 반환됩니다.

**예**

```
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) 7
127.0.0.1:6379> JSON.CLEAR k1  $[*]
(integer) 4
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>

보고서 정보 지원되는 하위 명령은 다음과 같습니다.
+ MEMORY <key> [path] - 메모리 사용량(단위: JSON 값 바이트)을 보고합니다. 경로는 제공되지 않으면 기본적으로 root로 설정됩니다.
+ FIELDS <key> [path] - 지정된 문서 경로의 필드 수를 보고합니다. 경로는 제공되지 않으면 기본적으로 root로 설정됩니다. 컨테이너가 아닌 각 JSON 값은 하나의 필드로 계산됩니다. 객체와 배열은 포함하는 JSON 값 각각에 대해 하나의 필드를 재귀적으로 계산합니다. 루트 컨테이너를 제외한 각 컨테이너 값은 하나의 추가 필드로 계산됩니다.
+ HELP - 명령의 도움말 메시지를 출력합니다.

구문

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

다음의 하위 명령에 따라 다릅니다.

MEMORY
+ 경로가 향상된 구문인 경우
  + 각 경로에 있는 JSON 값의 메모리 크기(바이트)를 나타내는 정수로 구성된 배열을 반환합니다.
  + Valkey 또는 Redis OSS 키가 없으면 빈 배열을 반환합니다.
+ 경로가 제한된 구문인 경우
  + 정수, 메모리 크기 및 JSON 값(단위: 바이트)을 반환합니다.
  + Valkey 또는 Redis OSS 키가 없으면 null을 반환합니다.

FIELDS
+ 경로가 향상된 구문인 경우
  + 각 경로에 있는 JSON 값의 필드 수를 나타내는 정수로 구성된 배열을 반반환합니다.
  + Valkey 또는 Redis OSS 키가 없으면 빈 배열을 반환합니다.
+ 경로가 제한된 구문인 경우
  + JSON 값의 필드 개수인 정수를 반환합니다.
  + Valkey 또는 Redis OSS 키가 없으면 null을 반환합니다.

HELP - 도움말 메시지 배열을 반환합니다.

**예**

향상된 경로 구문.

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

제한된 경로 구문.

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

문서 키의 경로에 있는 JSON 값을 삭제합니다. 경로가 root이면 Valkey 또는 Redis OSS에서 키를 삭제하는 것과 같습니다.

구문

```
JSON.DEL <key> [path]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**
+ 삭제된 요소 수입니다.
+ Valkey 또는 Redis OSS 키가 없으면 0입니다.
+ JSON 경로가 잘못되었거나 존재하지 않는 경우 0입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

[JSON.DEL](json-del.md)의 별칭.

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

하나 또는 여러 경로에서 직렬화된 JSON을 반환합니다.

구문

```
JSON.GET <key>
[INDENT indentation-string]
[NEWLINE newline-string]
[SPACE space-string]
[NOESCAPE]
[path ...]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ INDENT/NEWLINE/SPACE(선택 사항) - 반환된 JSON 문자열(즉, "예쁜 인쇄")의 형식을 제어합니다. 각 문자열의 기본값은 빈 문자열이며, 모든 조합으로 재정의될 수 있습니다. 임의의 순서로 지정할 수 있습니다.
+ NOESCAPE - 선택 사항, 레거시 호환성을 위해 사용할 수 있으며 다른 효과는 없습니다.
+ 경로(선택 사항) - 0개 이상의 JSON 경로, 아무 것도 제공되지 않는 경우 기본적으로 루트로 설정됩니다. 경로 인수는 끝에 배치해야 합니다.

**반환**

향상된 경로 구문.

 경로가 하나 지정된 경우,
+ 값의 배열의 직렬화된 문자열을 반환합니다.
+ 값을 선택하지 않은 경우 명령은 빈 배열을 반환합니다.

 여러 경로가 지정된 경우,
+ 각 경로가 키인 문자열화된 JSON 객체를 반환합니다.
+ 향상된 경로 구문과 제한된 경로 구문이 혼합된 경우 결과는 향상된 구문을 따릅니다.
+ 경로가 없는 경우 해당 값은 빈 배열입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

여러 문서 키의 경로에서 직렬화된 JSON을 얻습니다. 없는 키 또는 JSON 경로에 대해 null을 반환합니다.

**구문**

```
JSON.MGET <key> [key ...] <path>
```
+ 키(필수) - 문서 유형의 하나 이상의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다.

**반환**
+ 대량 문자열 배열 배열의 크기는 명령의 키 수와 같습니다. 키가 없는 경우, 경로가 문서에 없는 경우, 또는 경로가 잘못된 경우(구문 오류), 배열의 각 요소는 (a) 경로에 있는 직렬화된 JSON 또는 (b) null로 채워집니다.
+ 지정된 키 중 하나라도 있고 JSON 키가 아닌 경우 명령은 `WRONGTYPE` 오류를 반환합니다.

**예**

향상된 경로 구문.

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

 제한된 경로 구문.

```
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.MSET
<a name="json-mset"></a>

Valkey 버전 8.1 이상에서 지원됩니다.

여러 키의 JSON 값을 설정합니다. 작업은 원자성입니다. 모든 값이 설정되거나 아무 값도 설정되지 않습니다.

**구문**

```
JSON.MSET key path json [ key path json ... ]
```
+ 경로가 객체 멤버를 호출하는 경우
  + 상위 요소가 없는 경우, 다음 명령은 NONEXISTENT 오류를 반환합니다.
  + 상위 요소가 있지만 객체가 아닌 경우, 명령은 ERROR를 반환합니다.
  + 상위 요소가 있고 객체인 경우
    + 멤버가 없으면 상위 객체가 경로의 마지막 하위 객체인 경우에만 새 멤버는 상위 객체에 추가됩니다. 그렇지 않으면 명령은 NONEXISTENT 오류를 반환합니다.
    + 멤버가 있으면 해당 값이 JSON 값으로 대체됩니다.
+ 경로가 배열 인덱스를 호출하는 경우
  + 상위 요소가 없는 경우, 다음 명령은 NONEXISTENT 오류를 반환합니다.
  + 상위 요소가 있지만 배열이 아닌 경우, 명령은 ERROR를 반환합니다.
  + 상위 요소가 있지만 인덱스가 범위를 벗어난 경우, 명령은 OUTOFBOUNDARIES 오류를 반환합니다.
  + 상위 요소가 있고 인덱스가 유효하면 요소는 새 JSON 값으로 대체됩니다.
+ 경로가 객체 또는 배열을 호출하는 경우 값(객체 또는 배열)은 새 JSON 값으로 대체됩니다.

** 반환**
+ 단순 문자열 회신: 작업이 성공한 경우 '확인'입니다.
+ 단순 오류 응답: 작업이 실패한 경우입니다.

**예**

향상된 경로 구문.

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

제한된 경로 구문.

```
127.0.0.1:6379> JSON.MSET k1 . '{"name": "John","address": {"street": "123 Main St","city": "Springfield"},"phones": ["555-1234","555-5678"]}'
OK
127.0.0.1:6379> JSON.MSET k1 .address.street '"21 2nd Street"' k1 .address.city '"New York"'
OK
127.0.0.1:6379> JSON.GET k1 .address.street
"\"21 2nd Street\""
127.0.0.1:6379> JSON.GET k1 .address.city
"\"New York\""
```

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

경로의 숫자 값을 지정된 수만큼 증가합니다.

구문

```
JSON.NUMINCRBY <key> <path> <number>
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다.
+ 숫자(필수) - 숫자입니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 결과 값을 나타내는 대량 문자열 배열입니다.
+ 값이 숫자가 아닌 경우 해당 반환 값은 null입니다.
+ 숫자를 구문 분석할 수 없는 경우 `WRONGTYPE` 오류가 발생합니다.
+ 결과가 64비트 IEEE 배정밀도 범위를 벗어나는 경우 `OVERFLOW` 오류가 발생합니다.
+ 문서 키가 없는 경우 `NONEXISTENT`입니다.

경로가 제한된 구문인 경우
+ 결과 값을 나타내는 대량 문자열입니다.
+ 여러 값을 선택한 경우 명령은 마지막으로 업데이트된 값의 결과를 반환합니다.
+ 경로의 값이 숫자가 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ 숫자를 구문 분석할 수 없는 경우 `WRONGTYPE` 오류가 발생합니다.
+ 결과가 64비트 IEEE 배정밀도 범위를 벗어나는 경우 `OVERFLOW` 오류가 발생합니다.
+ 문서 키가 없는 경우 `NONEXISTENT`입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로의 숫자 값을 지정된 수만큼 곱합니다.

구문

```
JSON.NUMMULTBY <key> <path> <number>
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다.
+ 숫자(필수) - 숫자입니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 결과 값을 나타내는 대량 문자열 배열입니다.
+ 값이 숫자가 아닌 경우 해당 반환 값은 null입니다.
+ 숫자를 구문 분석할 수 없는 경우 `WRONGTYPE` 오류가 발생합니다.
+ 결과가 64비트 IEEE 배정밀 부동 소수점 숫자 범위를 벗어나는 경우 `OVERFLOW` 오류가 발생합니다.
+ 문서 키가 없는 경우 `NONEXISTENT`입니다.

경로가 제한된 구문인 경우
+ 결과 값을 나타내는 대량 문자열입니다.
+ 여러 값을 선택한 경우 명령은 마지막으로 업데이트된 값의 결과를 반환합니다.
+ 경로의 값이 숫자가 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ 숫자를 구문 분석할 수 없는 경우 `WRONGTYPE` 오류가 발생합니다.
+ 결과가 64비트 IEEE 이중 범위를 벗어나는 경우 `OVERFLOW` 오류가 발생합니다.
+ 문서 키가 없는 경우 `NONEXISTENT`입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로에 있는 객체 값의 키 수를 얻습니다.

구문

```
JSON.OBJLEN <key> [path]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 객체 길이를 나타내는 정수 배열입니다.
+ 값이 객체가 아닌 경우 해당 반환 값은 null입니다.
+ 문서 키가 없으면 null입니다.

경로가 제한된 구문인 경우
+ 정수, 객체의 키 수입니다.
+ 여러 객체를 선택한 경우 명령은 첫 번째 객체의 길이를 반환합니다.
+ 경로의 값이 객체가 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ `NONEXISTENT JSON`경로가 존재하지 않는 경우 오류가 발생합니다.
+ 문서 키가 없으면 Null입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로의 객체 값에 있는 키 이름을 얻습니다.

구문

```
JSON.OBJKEYS <key> [path]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**

경로가 향상된 구문인 경우
+ 대량 문자열 배열 각 요소는 일치하는 객체의 키 배열입니다.
+ 값이 객체가 아닌 경우 해당 반환 값은 빈 값입니다.
+ 문서 키가 없으면 null입니다.

경로가 제한된 구문인 경우
+ 대량 문자열 배열 각 요소는 객체의 키 이름입니다.
+ 여러 객체를 선택한 경우 명령은 첫 번째 객체의 키를 반환합니다.
+ 경로의 값이 객체가 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ 문서 키가 없으면 Null입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

Valkey 또는 Redis OSS(Redis Serialization Protocol)의 지정된 경로에 JSON 값을 반환합니다. 값이 컨테이너인 경우 응답은 RESP 배열 또는 중첩 배열입니다.
+ JSON null은 RESP Null 대량 문자열에 매핑됩니다.
+ JSON 부울 값은 각 RESP 단순 문자열에 매핑됩니다.
+ 정수는 RESP 정수에 매핑됩니다.
+ 64비트 IEEE 이중 부동 소수점 숫자는 RESP 대량 문자열에 매핑됩니다.
+ JSON 문자열은 RESP 대량 문자열에 매핑됩니다.
+ JSON 배열은 RESP 배열로 표현됩니다. 여기서 첫 번째 요소는 간단한 문자열 [이고 그 뒤에 배열의 요소가 옵니다.
+ JSON 객체는 RESP 배열로 표현됩니다. 여기서 첫 번째 요소는 간단한 문자열 \$1이고 그 뒤에 각각이 RESP 대량 문자열인 키-값 쌍이 옵니다.

구문

```
JSON.RESP <key> [path]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**

경로가 향상된 구문인 경우
+ 배열의 배열입니다. 각 배열 요소는 한 경로에 있는 값의 RESP 형식을 나타냅니다.
+ 문서 키가 없는 경우 빈 배열입니다.

경로가 제한된 구문인 경우
+ 경로에 있는 값의 RESP 형식을 나타내는 배열입니다.
+ 문서 키가 없으면 null입니다.

**예**

향상된 경로 구문.

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

제한된 경로 구문.

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

경로에 JSON 값을 설정합니다.

경로가 객체 멤버를 호출하는 경우
+ 상위 요소가 없는 경우 다음 명령은 NONEXISTENT 오류를 반환합니다.
+ 상위 요소가 있지만 객체가 아닌 경우 명령은 ERROR를 반환합니다.
+ 상위 요소가 있고 객체인 경우
  +  멤버가 없으면 상위 객체가 경로의 마지막 하위 객체인 경우에만 새 멤버는 상위 객체에 추가됩니다. 그렇지 않으면 명령은 NONEXISTENT 오류를 반환합니다.
  +  멤버가 있으면 해당 값이 JSON 값으로 대체됩니다.

경로가 배열 인덱스를 호출하는 경우
+ 상위 요소가 없는 경우 다음 명령은 NONEXISTENT 오류를 반환합니다.
+ 상위 요소가 있지만 배열이 아닌 경우 명령은 ERROR를 반환합니다.
+ 상위 요소가 있지만 인덱스가 범위를 벗어난 경우 명령은 OUTOFBOUNDARIES 오류를 반환합니다.
+ 상위 요소가 있고 인덱스가 유효하면 요소는 새 JSON 값으로 대체됩니다.

경로가 객체 또는 배열을 호출하는 경우 값(객체 또는 배열)은 새 JSON 값으로 대체됩니다.

구문

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

[NX \$1 XX] 여기에 [NX \$1 XX] 식별자 0개 또는 1개가 있을 수 있습니다..
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(필수) - JSON 경로입니다. 새 키의 경우 JSON 경로가 루트 '.' 여야 합니다.
+ NX(선택 사항) - 경로가 루트인 경우 키가 없는 경우에만 값을 설정합니다. 즉, 새 문서를 삽입합니다. 경로가 루트가 아니면 경로가 없는 경우에만 값을 설정합니다. 즉, 문서에 값을 삽입합니다.
+ XX(선택 사항) - 경로가 루트인 경우 키가 있는 경우에만 값을 설정합니다. 즉, 기존 문서를 교체합니다. 경로가 루트가 아니면 경로가 있는 경우에만 값을 설정합니다. 즉, 기존 값을 업데이트합니다.

**반환**
+ 성공 시 단순 문자열 '확인'.
+ NX 또는 XX 조건이 충족되지 않으면 null입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로에서 JSON 문자열에 문자열을 추가합니다.

구문

```
JSON.STRAPPEND <key> [path] <json_string>
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 루트로 설정됩니다.
+ json\$1string(필수) - 문자열의 JSON 표현입니다. JSON 문자열은 따옴표로 묶어야 합니다. 예: '"문자열 예"'.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 문자열의 새 길이를 나타내는 정수 배열입니다.
+ 경로의 값이 문자열이 아닌 경우 해당 반환 값은 null입니다.
+ `SYNTAXERR`입력 json 인수가 유효한 JSON 문자열이 아닌 경우 오류가 발생합니다.
+ `NONEXISTENT`경로가 없는 경우 오류가 발생합니다.

경로가 제한된 구문인 경우
+ 정수, 문자열의 새 길이입니다.
+ 여러 문자열 값을 선택한 경우 명령은 마지막으로 업데이트된 문자열의 새 길이를 반환합니다.
+ 경로의 값이 문자열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ 입력 json 인수가 유효한 JSON 문자열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ `NONEXISTENT`경로가 없는 경우 오류가 발생합니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로에서 JSON 문자열 값의 길이를 얻습니다.

구문

```
JSON.STRLEN <key> [path] 
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 문자열 값의 길이를 나타내는 정수 배열입니다.
+ 값이 문자열이 아닌 경우 해당 반환 값은 null입니다.
+ 문서 키가 없으면 null입니다.

경로가 제한된 구문인 경우
+ 정수, 문자열의 길이입니다.
+ 여러 문자열 값을 선택한 경우 명령은 첫 번째 문자열의 길이를 반환합니다.
+ 경로의 값이 문자열이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.
+ `NONEXISTENT`경로가 존재하지 않는 경우 오류가 발생합니다.
+ 문서 키가 없으면 Null입니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

경로에서 참과 거짓 사이의 부울 값을 토글합니다.

구문

```
JSON.TOGGLE <key> [path] 
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 결과 부울 값을 나타내는 정수 배열(0 - 거짓, 1 - 참)입니다.
+ 값이 배열이 부울 값이 아닌 경우 해당 반환 값은 null입니다.
+ 문서 키가 없는 경우 `NONEXISTENT`입니다.

경로가 제한된 구문인 경우
+ 결과 부울 값을 나타내는 문자열('참'/ '거짓')입니다.
+ 문서 키가 없는 경우 `NONEXISTENT`입니다.
+ 경로의 값이 부울 값이 아닌 경우 `WRONGTYPE` 오류가 발생합니다.

**예**

 향상된 경로 구문.

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

 제한된 경로 구문.

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

지정된 경로의 값 유형을 보고합니다.

구문

```
JSON.TYPE <key> [path]
```
+ 키(필수) - JSON 문서 유형의 Valkey 또는 Redis OSS 키입니다.
+ 경로(선택 사항) - JSON 경로입니다. 제공하지 않으면 기본적으로 root로 설정됩니다.

**반환**

경로가 향상된 구문인 경우
+ 각 경로에서 값 유형을 나타내는 문자열 배열입니다. 유형은 \$1"null', '부울', '문자열', '숫자', '정수', '개체'및 '배열'\$1 중의 하나입니다.
+ 경로가 없는 경우 해당 값은 null입니다.
+ 문서 키가 없는 경우 빈 배열입니다.

경로가 제한된 구문인 경우
+ 문자열, 값 유형
+ 문서 키가 없으면 null입니다.
+ JSON 경로가 잘못되었거나 없는 경우 null입니다.

**예**

향상된 경로 구문.

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

제한된 경로 구문.

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