-
Notifications
You must be signed in to change notification settings - Fork 0
Embedded JSON Editing ko
edgar edited this page Feb 23, 2026
·
1 revision
JSON 파일에는 이스케이프된 JSON 문자열이 값으로 포함되는 경우가 많습니다 — 설정 블롭, 직렬화된 페이로드, 문자열로 저장된 API 응답 등. jvim은 이러한 중첩된 JSON 구조를 전체 편집기 기능과 함께 자연스럽게 편집할 수 있게 해줍니다.
- JSON 문자열 값이 있는 줄에 커서를 위치
- Normal 모드에서
ej입력 - 파싱되고 포맷팅된 JSON이 표시된 새 편집기 패널이 열림
ej 명령은 다음 조건에서만 활성화됩니다:
- 커서 줄에 JSON 문자열 값이 포함됨 (따옴표로 감싼 문자열 탐지)
- 문자열 값을
json.loads()로 파싱했을 때 dict 또는 list가 생성됨 - 따옴표 안의 단순 값(문자열, 숫자, 불리언)은 내장 편집 대상이 아님
문자열이 유효한 JSON으로 파싱되지 않거나 컨테이너 타입이 아닌 것으로 파싱되면 ej는 동작하지 않습니다.
ej가 트리거되면:
- 메인 에디터가 읽기 전용이 됨 (EJ 패널이 열려 있는 동안 실수로 편집하는 것을 방지)
- 파싱되고 포맷팅된 JSON (
indent=4)이 표시된 사이드 패널이 열림 - 패널 제목에 표시:
Edit Embedded JSON (level N) - 메인 에디터의 스크롤 위치가 보존되며 패널이 닫힐 때 복원
내장 JSON 안의 내장 JSON도 편집할 수 있어 편집 레벨의 스택이 생성됩니다:
메인 문서
└─ EJ 레벨 1 (내장 JSON 문자열)
└─ EJ 레벨 2 (내장 JSON 안의 내장 JSON)
└─ EJ 레벨 3 ...
각 레벨은 다음을 저장하는 내부 스택에서 추적됩니다:
- 부모 문서에서의 소스 행과 열 범위
- 부모 문서 내용 (복원용)
- 원본 내용 (변경 감지용)
| 명령 | 동작 |
|---|---|
:w |
부모 문서에 저장하고 EJ 패널에서 편집 계속. 부모는 압축된 결과로 업데이트됨. |
:wq |
부모 문서에 저장하고 현재 EJ 레벨을 닫음 (스택 팝). 더 많은 레벨이 있으면 이전 레벨로 복귀. |
:q |
저장하지 않은 변경사항이 없으면 닫기. 변경사항이 있으면 경고 표시. |
:q! |
변경사항을 버리고 현재 EJ 레벨을 무조건 닫기. |
저장 시 (:w 또는 :wq):
- EJ 패널 내용이
json.loads()로 파싱됨 - 유효하지 않은 JSON이면 오류 표시 후 저장 중단
- 파싱된 JSON이
json.dumps()로 압축됨 (compact,ensure_ascii=False) - 압축된 문자열이 재직렬화(이중 인코딩)되어 유효한 JSON 문자열 값이 됨
- 부모 문서가 원래 소스 위치에서 업데이트됨
- 현재 내용이 원본과 다르면 패널 제목에
[+]표시가 나타남 - 변경 감지는 현재 에디터 내용을 EJ 패널이 열릴 때 찍은 스냅샷과 비교
- 표시는 키 입력마다 업데이트
내장 JSON을 부모에 저장할 때 값은 이중 인코딩을 거칩니다:
-
첫 번째 인코딩: 편집된 JSON이 압축 문자열로 직렬화 (예:
{"host": "localhost", "port": 8080}) -
두 번째 인코딩: 압축 문자열이
json.dumps()로 감싸져 유효한 JSON 문자열 값이 됨 (예:"{\"host\": \"localhost\", \"port\": 8080}")
이렇게 하면 부모 문서가 올바르게 이스케이프된 문자열 값을 가진 유효한 JSON으로 유지됩니다.
다음과 같은 JSON이 있을 때:
{
"config": "{\"host\": \"localhost\", \"port\": 8080}",
"data": "{\"users\": [{\"name\": \"Alice\"}]}"
}-
config줄로 커서 이동 →ej입력 - EJ 패널이 열리며 표시:
{ "host": "localhost", "port": 8080 } - 포트를
9090으로 편집 -
:wq입력하여 저장 및 복귀 - 부모 문서가 다음과 같이 표시:
{ "config": "{\"host\": \"localhost\", \"port\": 9090}", "data": "{\"users\": [{\"name\": \"Alice\"}]}" }
2단계에서 내장 JSON 자체에 JSON이 담긴 문자열이 있다면:
{
"inner": "{\"key\": \"value\"}"
}ej를 다시 입력하면 레벨 2 EJ 패널이 열리고, 내부 JSON을 편집한 후 스택을 통해 저장할 수 있습니다.