Query String Parser
Read every parameter in a link — or build a query string from a JSON object — without leaving the page.
What this tool does
Query String Parser takes everything after the first ? in whatever you paste — a whole URL, a bare querystring, or a fragment lifted out of a server log — splits it on &, percent-decodes each name and each value, and lists the result as a two-column table in the order the link wrote them. A name that appears twice gets two rows rather than one, and a name written with no = at all is listed as (no value), so the difference between flag= and flag is on screen instead of guessed at.
Three settings shape the parse, and only one of them changes the table. Treat + as a space is on by default: form-encoded links write news+letter where a URL-encoded one writes news%20letter, and only you know which convention produced the link in front of you. Expand bracket notation and Repeated keys act on a structured object the parse builds behind the table and the page does not display. Brackets show up indirectly, in that filter[price][max] and filter[colour] then count as one distinct key in the summary line rather than two. The Repeated keys choice between an array, the first value and the last changes nothing visible at all: the table lists every occurrence either way, and the distinct-key count is the same for all three.
Switch Direction to JSON object → query string and it runs the other way. Paste a flat object such as {"q":"flat white","tag":["a","b"],"page":2} and you get q=flat%20white&tag=a&tag=b&page=2: array values repeat the name, numbers and booleans become their text, and null becomes an empty value. Encoding is percent escapes throughout, so a space is always %20 and never +, and the string comes back with no leading ? so it can be appended to whatever you already have. One level of nesting is handled — {"a":{"b":"c"}} is written as a%5Bb%5D=c, which this tool reads back as nesting — but a second level is not: the inner object is stringified before escaping, so the value arrives as %5Bobject%20Object%5D. Flatten before you paste.
The work happens in this browser tab and nothing is uploaded, which counts for more here than it looks: query strings are where session tokens, signed expiry parameters, email addresses and internal hostnames end up. Three details decide whether the rows you see are the whole story. Only & separates pairs, so the older semicolon convention is not recognised and a;b=1 is read as one parameter named a;b. A # ends the query, but only when a ? came before it — in a hash-routed address such as /#/dashboard?tab=2 the first ? sits inside the fragment, so those parameters are parsed like any others and no fragment is reported. And a value that is not valid percent-encoding, a stray %zz say, is left exactly as it stands rather than stopping the run.
How to use it
- Paste the link or the query string. A whole URL, or just the part after the ?. Press Load sample for a link carrying a repeated name, a bracketed filter and a + used as a space.
- Set + handling to match the source. Leave Treat + as a space on for form-encoded links. Turn it off when a genuine plus sign belongs to the value, as it does in an email address.
- Adjust the structure options if the count matters. Expand bracket notation folds filter[price][max] and filter[colour] into a single distinct key in the summary. Repeated keys shapes the object behind the table, so it moves no number you can read.
- Read the rows, or copy them as CSV. Parameters come back one row each, in the order written. Copy hands you those same rows as comma-separated text, which pastes straight into a spreadsheet or a ticket.
- Run it backwards when you need to. Switch Direction to JSON object → query string, paste a flat object, and the output pane holds the encoded string ready to append to a path.
Processing & privacy
Runs on your device. Your file is processed directly in this browser.
Common use cases
Debugging a campaign link
utm_source, utm_medium and utm_campaign are easy to duplicate or misspell. One row per parameter shows the tag that got written twice with two different values.
Reading a redirect or callback URL
OAuth and payment returns pack state, a nonce and an encoded destination into one line. Decoding turns %3A%2F%2F back into :// so the nested address becomes readable.
Checking what a GET form actually submitted
The url params are the whole request. The table shows which fields arrived empty, which arrived twice, and which never arrived at all.
Assembling a request by hand
Build direction takes an object you already have in a test fixture and returns the encoded string, without hand-escaping every space and ampersand.
Questions
Does the link get uploaded?
Why does it say no query string was found?
Does the Repeated keys setting change the table?
Are numbers returned as numbers?
What happens to a fragment?
Can it build nested parameters?
How is this different from URL Parser?
Related tools
- JSON Formatter — Pretty-print, collapse and inspect JSON instantly.
- Base64 Encoder Decoder — Encode and decode Base64 text and files.
- JWT Decoder — Inspect the header, payload and claims of a JWT.
- Hash Generator — Compute MD5, SHA-1, SHA-256 and SHA-512 digests.
- Regex Tester — Test patterns against sample text with live matches.
- Unix Timestamp Converter — Convert between epoch seconds and readable dates.