원문 캡처 · joinjson.com
원문 캡처 · joinjson.com

JoinJSON은 브라우저에서 JSON 파일을 병합·비교하고, JSON 샘플을 TypeScript·Zod·Python 모델이나 YAML로 변환하는 도구다. 붙여넣거나 파일을 불러와 결과를 확인한 뒤 복사하거나 다운로드할 수 있으며, 입력한 JSON은 URL 불러오기를 제외하면 서버로 전송되지 않는다.

비교와 형식 변환

두 JSON 문서를 나란히 비교하면 변경 내용을 Added, Deleted, Modified로 표시하고 JSON Pointer 경로를 함께 보여준다. 객체 키의 순서는 비교에 영향을 주지 않는다. 입력값은 각각 최대 1MB이며, 비교는 현재 탭에서 실행된다. 비교 라이브러리는 jsDelivr에서 불러오지만 JSON은 해당 서비스로 전송되지 않는다.

JSON 샘플에서 TypeScript·Zod 스키마 또는 Python 모델을 생성할 수 있다. TypeScript 변환은 인터페이스나 타입 별칭을 선택하고, 루트 타입 이름을 지정하거나 모든 속성을 선택적으로 만들 수 있다. TypeScript 내보내기 설정도 제공한다. 비객체 루트 값은 어느 모드에서든 타입 별칭으로 표현한다. 샘플에 있는 구조만 추론하므로 전체 데이터 모델을 대신하지 않는다. 빈 배열은 unknown, 혼합 배열은 유니언 타입으로 처리한다.

Zod 변환 결과는 TypeScript 코드로 출력하고 복사하거나 .ts 파일로 다운로드할 수 있다. 빈 배열은 z.unknown(), 혼합 배열은 유니언으로 표현한다. Python 변환은 Pydantic의 BaseModel 또는 표준 데이터 클래스를 생성하며 Optional[T] 사용 여부를 선택할 수 있다. Python 3.9 이상이 필요하다. 배열과 원시 값 루트는 value 필드를 가진 Root 모델로 만든다. 빈 배열에는 Any, 혼합 배열에는 유니언을 사용한다. 선택적 타입을 쓰면 None을 허용하고 모든 필드의 기본값을 None으로 둔다. Pydantic은 별칭으로 이름이 바뀐 키를 보존한다. 데이터 클래스는 원래 키를 필드 메타데이터에 기록하지만 JSON을 자동으로 파싱하거나 검증하지 않는다.

JSON과 YAML은 양방향으로 변환할 수 있으며 들여쓰기 폭은 2칸 또는 4칸으로 설정한다. 변환은 현재 탭에서 이뤄지고 입력값은 저장되지 않는다. YAML 라이브러리는 jsDelivr에서 불러오지만 데이터는 그곳으로 전송되지 않는다. JSON과 호환되는 값이 담긴 YAML 문서 하나를 지원한다. 주석과 서식은 보존하지 않으며 날짜는 문자열로 남는다. 순환 별칭, 유한하지 않은 수, 1MB를 넘는 입력, 지나치게 깊은 중첩이나 과도한 별칭 확장은 거부한다.

JSON 병합 방법과 조건

병합은 두 파일을 한 번에 처리한다. 여러 파일을 합치려면 두 파일을 병합한 결과를 다음 병합의 기준으로 사용한다. 먼저 기준 문서를 First JSON에, 갱신 문서를 Second JSON에 넣는다. 충돌하는 값은 기본적으로 두 번째 문서의 값이 우선한다. 두 객체를 결합할 때 첫 번째 문서에만 있는 키는 유지하고 두 번째 문서에만 있는 새 키도 추가한다. Swap A ↔ B를 누르면 우선순위를 바꿀 수 있다.

각 입력은 붙여넣기, 로컬 .json 파일 업로드, URL 불러오기로 넣는다. 붙여넣을 때는 JavaScript 변수 선언이나 Markdown 코드 펜스가 아니라 완전한 JSON 값을 입력해야 한다. 객체 키와 문자열 값은 큰따옴표로 감싸고 후행 쉼표는 쓸 수 없다. 파일은 브라우저에서 읽으며 JoinJson 처리 서버로 업로드되지 않는다. 파일 불러오기는 최대 20MB를 지원한다.

URL은 공개된 HTTPS 주소여야 하며, 브라우저에서 읽을 수 있도록 교차 출처 리소스 공유(CORS)를 허용해야 한다. URL을 불러오면 해당 출처에 직접 요청하므로 출처 서버가 IP 주소와 요청 주소를 받을 수 있다. 비밀번호, 접근 토큰, 기밀 쿼리 매개변수가 들어간 링크는 피해야 한다. 쿠키가 필요한 비공개 엔드포인트는 지원하지 않는다. 브라우저 요청이 허용되지 않는 서버라면 파일을 직접 다운로드한 뒤 업로드할 수 있다.

각 입력의 상태 표시는 비어 있음, 유효한 JSON, 오류를 구분한다. 오류에는 확인할 줄이 표시되지만 실제 오류는 표시된 줄보다 앞에서 시작했을 수 있다. 예를 들어 쉼표 누락이나 닫히지 않은 문자열이 원인일 수 있다. 서식 기능은 유효한 문서를 읽기 쉽게 만들고, 찾기 기능은 키나 값을 검색하며, 줄 바꿈 기능은 가로 스크롤을 줄인다. 검증은 JSON 문법만 확인하므로 가격이나 계정 식별자가 업무 규칙에 맞는지는 판단하지 않는다.

Advanced options에서 중첩 객체와 배열의 처리 방식을 바꿀 수 있다. 깊은 병합을 켜면 일치하는 중첩 객체를 재귀적으로 결합한다. 끄면 충돌하는 중첩 값 전체를 두 번째 객체의 값으로 바꾼다. 배열의 기본 동작은 두 번째 배열로 교체하는 것이다. Concatenate both는 두 번째 배열을 첫 번째 배열 뒤에 붙이고, Merge by ID는 선택한 식별자 필드를 기준으로 배열 항목을 결합한다. 객체는 키를 합치며, 그 밖의 값은 선택한 충돌 처리 방식에 따른다.

두 입력이 모두 유효한 JSON이면 Merge JSON을 누르거나 Ctrl/Cmd+Enter를 입력해 병합한다. 결과 패널에서 추가된 키와 덮어쓴 값을 확인할 수 있고, 충돌하는 각 경로마다 어느 값을 사용할지 선택하면 결과가 자동으로 갱신된다. 결과는 복사하거나 .json 파일로 다운로드할 수 있으며, TypeScript·Python·TOML·Go·Pydantic·YAML로 변환하거나 병합된 JSON을 비교하는 기능도 있다. 입력이나 병합 옵션을 바꾸면 이전 결과가 지워져 최신 결과로 오인하지 않게 한다. Clear all은 화면의 작업 입력을 지운다.

매우 큰 문서는 페이지 반응성을 위해 미리보기 범위가 제한되지만 복사와 다운로드에는 직렬화된 전체 결과가 포함된다. 다운로드는 새 파일을 저장할 뿐 원본 파일을 수정하지 않는다. 병합이 성공해도 결과가 애플리케이션에 적합하다는 뜻은 아니므로 중요한 중첩 필드, 배열 길이, 의도한 변경을 검토해야 한다. 내보낸 뒤에는 프로젝트에서 사용하는 스키마나 애플리케이션 검사로 결과를 확인해야 한다. JavaScript 숫자는 매우 큰 정수 식별자의 정밀도를 잃을 수 있으므로 필요한 경우 식별자를 문자열로 유지한다.

붙여넣기와 업로드 파일의 파싱·검증·병합·결과 표시는 브라우저에서 실행되며, 홈페이지는 JSON을 앱 저장소에 보관하지 않는다. 다만 클립보드 기록, 다운로드한 파일, 브라우저 확장 프로그램은 도구가 통제하지 않는다. URL을 불러오면 해당 출처에 접속한다.

깊은 병합 예시

깊은 병합은 일치하는 객체를 한 단계씩 결합한다. 두 번째 값은 첫 번째 값과 충돌하면 이를 대체한다. 다만 두 값이 모두 객체면 결합하고, 배열이면 선택한 배열 규칙을 적용한다. 없는 키는 유지되며 null은 키 삭제 명령이 아니라 값으로 취급한다.

첫 번째 JSON이 {"profile": {"name": "Ana", "theme": "light"}, "active": true}이고 두 번째 JSON이 {"profile": {"theme": "dark"}, "city": "Chennai"}라면, 깊은 병합 결과는 {"profile": {"name": "Ana", "theme": "dark"}, "active": true, "city": "Chennai"}다. 이름은 충돌하는 갱신이 없어 유지되고, 테마는 두 번째 값으로 바뀐다. 깊은 병합을 끄면 profile 전체가 {"theme": "dark"}로 바뀌어 중첩된 이름이 결과에서 사라진다. 자세한 내용은 깊은 병합과 얕은 병합 안내에서 확인할 수 있다.

붙여넣기와 다운로드

Paste & Download는 JSON, 코드 또는 텍스트를 붙여넣어 파일로 저장하는 기능이다. 파일 형식은 확장자만 정하며 내용을 변환·검증·실행하지 않는다. 다운로드 파일은 브라우저에서 로컬로 생성된다. JSON, 일반 텍스트, JavaScript, TypeScript, React JSX, React TSX, HTML, CSS, Python, Jupyter Notebook, YAML, TOML, XML, CSV, Markdown, SQL, Shell, Go, Java 또는 사용자 지정 확장자를 선택할 수 있다. 파일 이름과 확장자를 지정하며, 내용을 입력해야 다운로드할 수 있다.

자주 묻는 질문

붙여넣거나 업로드한 JSON은 서버로 전송되지 않는다. 단, URL 불러오기는 문서를 가져오기 위해 출처 서버에 접속한다. 복사와 다운로드는 사용자가 요청할 때만 데이터를 내보낸다. 호스팅 및 광고 관련 내용은 개인정보 처리방침에서 확인할 수 있다.

같은 키가 두 문서에 있으면 충돌 값은 두 번째 JSON이 우선한다. 깊은 병합을 켠 경우 일치하는 객체를 먼저 재귀적으로 결합한다. 첫 번째 문서에만 있는 키는 남고 두 번째 문서에만 있는 키는 추가된다. 입력 순서를 바꾸면 우선순위도 바뀐다.

배열을 합칠 때 기존 항목을 유지하려면 Concatenate both를 선택해 항목을 뒤에 붙이거나, Merge by ID를 선택해 id 같은 공통 필드가 있는 객체를 결합한다. Replace with second는 갱신된 배열만 남긴다. 얕은 객체 모드에서 충돌하는 중첩 배열에도 선택한 배열 규칙이 적용된다.

JSON URL이 다른 탭에서 열리더라도 도구에서 불러오지 못할 수 있다. 브라우저가 페이지를 표시할 수 있어도 다른 웹사이트가 내용을 읽는 것은 차단될 수 있다. 출처는 CORS 접근을 허용해야 하며, HTTPS를 사용하고 유효한 JSON을 반환해야 한다. 파일은 20MB 이하여야 한다. 쿠키가 필요한 비공개 엔드포인트는 지원하지 않는다. 직접 다운로드한 .json 파일을 업로드하는 방법도 있다.

변경 강조 표시는 결과가 잘못됐다는 뜻이 아니다. 첫 번째 입력과 비교해 추가된 키와 덮어쓴 값을 보여줄 뿐이며, 스키마 검증이나 정확성 평가는 하지 않는다. 결과를 사용하기 전에 의도한 변경인지 확인하고 프로젝트의 일반적인 검사를 실행해야 한다.