JSON.parse is all-or-nothing. It needs a balanced document before it returns a value, so a token stream that is still open is not a state the standard parser models, it is an input error 12. Any consumer that buffers until the closing brace pays the full generation latency before showing anything.
That latency is real. A multi-kilobyte structured response from a frontier model takes seconds to emit in full, and industry write-ups cited in that same analysis put the perceived-latency improvement from progressive rendering at roughly 60 to 70 percent, not because generation gets faster but because motion replaces waiting 12. The schema you write determines how much of that window you can fill with useful pixels.
The obvious workaround is worse than the wait: call JSON.parse or a repair library on every chunk. That re-parses the whole prefix per token, which is quadratic. The same write-up records the measured difference: a naive 12 KB parse took 16.7 seconds with final chunks at 19 to 20 milliseconds each, while a stateful incremental parser ran the same workload in 43 milliseconds, a 388x gap, and the naive version became unusable around the 5 KB mark 12. So the baseline already assumes you have an incremental parser. The schema question is what that parser can hand you early.
Incremental parsers exist and are the foundation. jsonriver yields a series of partial values designed to plug into UI = f(state) rendering 11. Other libraries follow the same idea, including jsonchunk 15, chunkjson 20 and best-effort-json-parser, whose README shows a truncated input like [1, 2, {"a": "apple returning [1, 2, { a: 'apple' }] 14. But none of them can invent structure your schema did not contain. A parser gives you a floor; the schema sets the ceiling.



