DEV Community

OnePassApps
OnePassApps

Posted on

JSON to CSV in the Browser: Formula Cells, Nested Values and the Exact Bytes

JSON to CSV in the Browser: Formula Cells, Nested Values and the Exact Bytes

Disclosure first: I work on OnePassApps, the team behind app.onepassapps.com. Everything below was measured in the live tab on 4 November 2026, and every quoted string was read off the panel itself.

A JSON payload usually has to become a CSV before it can go into a spreadsheet, a ticket, or somebody else's tool. I wrote about the privacy side of that conversion in an earlier post on this tab; this one is about what actually lands in the file - which rows you get, which characters survive, and what happens to a cell that starts with an equals sign.

The Data Studio has a To CSV tool that runs in the browser tab. Its panel is three steps: 01 Source, 02 Options, 03 Result.

What the tab says it does

Under 02 Options the panel states, in full:

Each object becomes a row and its keys the header row. Nested values are kept as JSON text. Formula-like cells are prefixed with an apostrophe.

Three rules, and the third one is the reason this post exists.

First run: two objects, six columns, 174 bytes

I pasted a two-object JSON array into 01 Source (fields: id, name, active, score, tags, meta), pressed Convert JSON to CSV, and the 03 Result step read:

  • "Ready"
  • "CSV output is ready. Formula-like cells are prefixed with an apostrophe."
  • Format "CSV", Size "174 B", Lines "3", "Converted in 49 ms"
  • "GENERATED OUTPUT" / "Generated CSV" / "2 rows - 6 columns - 174 B - from Pasted JSON"
  • a "Table" and "Raw" toggle and a "Download CSV" button

I pressed Download CSV and got a file called data.csv of exactly 174 bytes - the same number the Size counter had shown. Its contents:

"id","name","active","score","tags","meta"
"1","Ada","true","","[""alpha"",""beta""]","{""plan"":""pro"",""seats"":3}"
"2","Grace","false","98.5","[]","{""plan"":""free""}"
Enter fullscreen mode Exit fullscreen mode

Five things to notice in those three lines:

  • Every value is quoted, including the number 98.5 and the booleans true and false. Nothing is left bare.
  • A null becomes an empty string. score was null in the first object and the CSV holds "".
  • A nested array stays JSON text: "[""alpha"",""beta""]", with the inner quotes doubled the way CSV escapes a quote inside a quoted field.
  • A nested object stays JSON text as well: "{""plan"":""pro"",""seats"":3}".
  • The line endings are CRLF, and the "Lines" counter of 3 counted the header row plus the two data rows.

Second run: what counts as a formula-like cell

Same tab, one object, nine fields, several of them deliberately awkward. The panel reported "1 row - 9 columns - 120 B", and the downloaded data.csv was again exactly the size the counter promised - 120 bytes:

"id","f","g","h","i","j","k","l","m"
"1","'=SUM(A1:A2)","'+1+1","'@handle","'-2+3","'=1+1","","plain text","'=cmd|calc"
Enter fullscreen mode Exit fullscreen mode

So:

  • A leading = gets an apostrophe: =SUM(A1:A2) becomes '=SUM(A1:A2), and =1+1 becomes '=1+1.
  • A leading + gets one: +1+1 becomes '+1+1.
  • A leading @ gets one: @handle becomes '@handle.
  • A leading - gets one: -2+3 becomes '-2+3.
  • The apostrophe is the only thing added. =cmd|calc comes out as '=cmd|calc - the pipe is untouched.
  • A null is still an empty string, and ordinary text is left exactly as it was: plain text stayed plain text, with no apostrophe.

Why it matters: spreadsheets treat a cell that starts with =, +, @ or - as a formula to evaluate. Prefixing such a cell is the standard way to keep it text. I did not open the file in Excel or Google Sheets, so I can report the bytes the browser produced, but not how a given spreadsheet then reads them.

The rest of the panel

  • The Studio line on that page: "Processing stays in this browser."
  • The plan block: "FREE PROMOTIONAL PERIOD", "Standard is free right now", "$0 / month", "100,000 credits every 30 days - No end date set - No card required", "No automatic paid subscription. Existing paid subscriptions keep their terms."

Limits, stated honestly

  • One build, one browser, one day (4 November 2026), signed out. Two runs, both with pasted JSON - I did not load the JSON from a file.
  • I did not test non-ASCII text, tabs, embedded newlines, a UTF-8 BOM, an empty array, or a top-level JSON value that is not an array of objects.
  • I did not open the CSV in a spreadsheet, so the formula-cell behaviour is reported as bytes, not as observed spreadsheet behaviour.
  • I did not exercise the "Raw" view, the "Table" toggle, or the file-picker path.
  • Both runs reported "Converted in 49 ms"; that is a timing on a two-row and a one-row file, not a benchmark.
  • Every string quoted above was read off the live panel or out of the downloaded file. Nothing here is from memory.

The app guides list the rest of the tools in the set.

Top comments (0)