MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

JSON을 쿼리 스트링으로 변환

JSON 객체를 URL 인코딩된 쿼리 스트링으로 바꾸고, 서버에 맞는 배열 방식·null 처리·대괄호 인코딩을 고릅니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

배열
null 값
빈 배열·객체

a=[]를 a[]=로 남겨 키가 사라지지 않게 합니다.

JSON 입력

27줄435byte

결과

⌘/Ctrl + Enter로 복사
결과 · query.txt
id=4821&status=shipped&customer%5Bid%5D=77&customer%5Bname%5D=Ada+Lovelace&customer%5Bemail%5D=ada%40example.com&customer%5Bvip%5D=true&items%5B0%5D%5Bsku%5D=KB-100&items%5B0%5D%5Bname%5D=Keyboard&items%5B0%5D%5Bqty%5D=1&items%5B0%5D%5Bprice%5D=49.9&items%5B1%5D%5Bsku%5D=MS-220&items%5B1%5D%5Bname%5D=Mouse&items%5B1%5D%5Bqty%5D=2&items%5B1%5D%5Bprice%5D=19&total=87.9&shipped_at=2026-03-14T09%3A30%3A00Z&tracking=
파라미터17
크기415byte

이 변환기는 JSON 객체를 URL 쿼리 스트링으로 바꿉니다. 최상위 키는 파라미터가 되고 중첩 객체는 filter[min]=1 같은 대괄호 표기로 쓰입니다. 배열은 tags[0]=a, tags[]=a, 반복 키 tags=a&tags=b 중에서 서버가 파싱하는 방식으로 고를 수 있습니다. 결과는 URL의 ? 뒤에 붙이거나 application/x-www-form-urlencoded 요청 본문으로 쓸 수 있습니다.

API 문서처럼 JSON으로 적힌 요청에 대응하는 GET URL을 브라우저, curl, 테스트용으로 만들어야 할 때 유용합니다. 대괄호 방식은 PHP, Rails, Node.js의 qs 라이브러리 같은 서버 파서가 이해하고, 반복 키는 그 밖의 대부분의 프레임워크가 기대합니다.

변환은 브라우저 안에서 이루어집니다. 200,000자를 넘는 입력은 Web Worker에서 처리하고 1,000,000자를 넘으면 편집기에서 원문을 숨기되 전체를 변환합니다. 입력은 20 MiB까지이며 JSON 루트는 객체여야 합니다.

사용 방법

  1. JSON 객체 붙여넣기

    파라미터를 JSON으로 붙여넣거나 샘플(API 응답, 중첩 배열, 경계 사례)을 불러옵니다. 쿼리 스트링에는 이름이 필요하므로 최상위 배열이나 단순 값은 거부됩니다.

  2. 배열 방식 고르기

    서버나 프레임워크가 기대하는 대로 인덱스 배열 a[0]=1, 대괄호 배열 a[]=1, 반복 키 a=1&a=2 중 하나를 고릅니다.

  3. null과 빈 값 정하기

    null은 a=로 쓰거나, 빼거나, 텍스트 a=null로 쓸 수 있습니다. 빈 배열과 빈 객체는 기본적으로 빠지고, 배열은 a[]=, 객체는 a=로 남길 수도 있습니다.

  4. 대괄호 인코딩 선택

    대괄호는 기본으로 %5B, %5D로 인코딩됩니다. [ ] 이스케이프 안 함을 켜면 브라우저나 로그에 붙여넣어 읽기 쉬운 형태로 둡니다.

  5. 알림 확인 후 사용

    알림은 뺀 빈 값·null의 수를, 파라미터 수치는 쓴 개수를 알려 줍니다. 출력을 ? 뒤에 붙이거나 폼 본문으로 보내고, 쿼리→JSON 도구로 다시 풀어 왕복이 맞는지 확인하세요.

작동 원리

펼치는 규칙

도구는 객체를 깊이 우선으로 순회합니다. 중첩 객체는 현재 이름에 [key]를 덧붙이고, 배열은 [index]나 []를 덧붙이거나 이름을 반복하며, 스칼라는 파라미터 하나로 추가됩니다. 첫 단계에는 대괄호가 없어서 [page]=2가 아니라 page=2입니다.

스칼라는 String(value)로 바뀌어 true는 true, 숫자는 JavaScript 표기 그대로입니다. null, 빈 배열, 빈 객체는 쓸 값이 없으므로 각자 옵션을 따릅니다. null은 a=, 생략, a=null 중 하나이고, 빈 배열·객체는 생략하거나 a[]=, a=로 남깁니다. 뺀 개수는 알림으로 알려 줍니다.

JSON쿼리 스트링
{"a":1}a=1
{"a":{"b":1}}a%5Bb%5D=1 ([ ] 이스케이프 안 함이면 a[b]=1)
{"a":[1,2]}a%5B0%5D=1&a%5B1%5D=2, 또는 a[]=1&a[]=2, 또는 a=1&a=2
{"a":null}a= (기본), 생략, 또는 a=null
{"a":[]}없음(기본) 또는 a[]=

URLSearchParams 인코딩

이름과 값은 브라우저의 URLSearchParams가 인코딩하며, WHATWG URL 표준의 application/x-www-form-urlencoded 규칙을 따릅니다. 공백은 +가 되고 안전한 집합 밖의 문자는 UTF-8 퍼센트 인코딩되며, 대괄호도 %5B, %5D가 됩니다.

서버는 대괄호를 파싱하기 전에 %5B0%5D를 [0]으로 디코딩하므로 인코딩된 형태와 읽기 쉬운 형태는 같은 뜻입니다. [ ] 이스케이프 안 함 옵션은 그 두 이스케이프만 되돌려 읽기 편하게 할 뿐이고, 엄격한 URL 파서는 인코딩된 형태를 선호합니다.

서버마다 이해하는 배열 방식

쿼리 스트링의 중첩 데이터에는 표준이 없습니다. PHP와 Node의 qs는 a[0]이나 a[]에서 배열을 복원합니다. Rails는 a[]를 배열로 읽지만 숫자 키 a[0]에서는 배열을 복원하지 않습니다. 많은 프레임워크는 tags[0]을 평범한 키로 봅니다. Go의 net/url처럼 반복 키(tags=a&tags=b)를 기대한다면 세 번째 배열 옵션을 쓰세요.

실제 예시

평평한 객체
입력
{"q":"hello world","page":2,"ok":true}
출력
q=hello+world&page=2&ok=true

문자열, 숫자, 불리언이 key=value 쌍이 됩니다. 문자열 안의 공백은 URLSearchParams가 폼 데이터를 인코딩하는 방식대로 +로 쓰입니다.

배열과 중첩 객체
입력
{"tags":["a","b"],"filter":{"min":1,"max":null}}
출력
tags%5B0%5D=a&tags%5B1%5D=b&filter%5Bmin%5D=1&filter%5Bmax%5D=

배열은 숫자 대괄호(tags[0]), 중첩 객체는 이름 대괄호(filter[min])를 씁니다. 대괄호는 %5B, %5D로 인코딩되고 null은 빈 값(filter[max]=)이 됩니다.

배열을 반복 키로
입력
{"tags":["a","b"],"page":2}
출력
tags=a&tags=b&page=2

반복 키 옵션에서는 배열이 tags=a&tags=b로 쓰이며, 단순한 프레임워크가 목록으로 모으는 형태입니다.

null, 빈 컨테이너, 읽기 쉬운 대괄호
입력
{"a":null,"tags":[],"o":{},"d":{"x":1}}
출력
a=null&tags[]=&o=&d[x]=1

null은 a=null로, 빈 배열은 tags[]=로, 빈 객체는 o=로 남고, [ ] 이스케이프 안 함 덕분에 d[x]=1이 읽기 쉽게 나옵니다. 기본 옵션이라면 세 빈 값은 a=만 쓰이고 tags와 o는 빠지며, 뺀 두 개는 알림이 알려 줍니다.

예약 문자, 유니코드, 키 안의 공백
입력
{"x":"a&b=c","k":"한글","a b":1}
출력
x=a%26b%3Dc&k=%ED%95%9C%EA%B8%80&a+b=1

값 안의 &와 =는 이스케이프되고, 한글은 UTF-8 퍼센트 인코딩되며, 키 a b의 공백은 +가 됩니다.

객체 배열을 대괄호 배열로
입력
{"a":[{"b":1},{"b":2}]}
출력
a%5B%5D%5Bb%5D=1&a%5B%5D%5Bb%5D=2

원소마다 a[][b]로 펼쳐집니다. 객체당 키가 하나일 때는 괜찮지만, 키가 여러 개인 객체는 아래 주의사항을 보세요.

자주 하는 실수

  • 빈 배열과 객체는 기본으로 사라집니다

    {"tags":[]}는 알림과 함께 빈 쿼리 스트링이 되어 서버가 빈 목록과 없는 값을 구분하지 못합니다. 차이가 중요하면 빈 배열과 객체 옵션을 a[]=로 남김으로 바꾸세요.

  • 서버가 이해하는 null 방식을 고르세요

    a=는 대부분의 서버에 빈 문자열로, a=null은 네 글자 텍스트로 전달되고, 키를 빼면 아예 보내지 않은 것과 같습니다. 쿼리 스트링에는 진짜 null이 없으므로 어느 쪽도 null이 아닙니다.

  • 숫자가 타입을 잃습니다

    모든 값이 텍스트가 됩니다. page=2는 문자열 2로 서버에 닿고 불리언은 true, false 문자열로 도착합니다.

  • 대괄호와 반복 방식은 객체 경계를 흐립니다

    {"a":[{"b":1,"c":2}]}처럼 키가 여러 개인 객체의 배열은 대괄호 방식에서 a[][b]=1&a[][c]=2가 되고, 파서는 이를 객체 두 개로 읽습니다. 객체 배열에는 인덱스 방식을 쓰세요. 반복 키 방식은 중첩 배열을 평평하게 만들고 원소가 하나인 배열을 단순 값으로 바꾼다는 점도 기억하세요.

  • 루트는 객체여야 합니다

    최상위 배열이나 단순 값은 거부됩니다. 원하는 키를 가진 객체로 감싸세요.

  • 너무 긴 쿼리 스트링은 거부될 수 있습니다

    브라우저, 프록시, 서버는 보통 URL을 수천~8천 자로 제한합니다. 큰 데이터는 POST 본문을 쓰세요.

자주 묻는 질문

중첩 객체는 어떻게 쓰이나요?

대괄호로 쓰입니다. {"a":{"b":1}}은 a[b]=1이 되고, 대괄호를 이스케이프 안 함으로 두지 않으면 a%5Bb%5D=1로 인코딩됩니다.

배열은 어떻게 쓰이나요?

기본은 숫자 인덱스로 tags[0]=a&tags[1]=b입니다. 배열 옵션에서 tags[]=a&tags[]=b나 반복 키 tags=a&tags=b도 고를 수 있습니다.

공백이 왜 더하기 기호가 되나요?

인코더가 폼 인코딩을 따르기 때문이며, 폼 인코딩에서는 공백을 +로 씁니다. 쿼리 스트링을 읽는 서버는 +를 공백으로 디코딩합니다.

대괄호도 인코딩되나요?

네, [ ] 이스케이프 안 함을 켜지 않으면 %5B, %5D로 인코딩됩니다. 서버에서 [와 ]로 디코딩되며 같은 뜻입니다.

null, true, 숫자는 어떻게 되나요?

true와 숫자는 true, 2 같은 텍스트가 됩니다. null은 null 값 옵션을 따라 빈 값 a=, 생략, 텍스트 a=null 중 하나가 됩니다.

빈 배열과 객체를 남길 수 있나요?

네. 빈 배열과 객체 옵션을 a[]=로 남김으로 두면 빈 배열은 a[]=, 빈 객체는 a=가 됩니다.

쿼리 스트링을 다시 JSON으로 바꿀 수 있나요?

네, 쿼리→JSON 도구로 가능합니다. 그쪽에서 숫자·불리언 파싱을 켜지 않으면 값은 문자열로 돌아옵니다.

JSON이 어딘가로 전송되나요?

아니요. 변환은 브라우저 안에서 이루어집니다.

마지막 업데이트: