HTML Table to JSON
Paste an HTML table — from a web page, a docs example or a CMS — and get a JSON array of objects. The header row becomes keys; numbers and booleans are typed automatically.
Table markup in, structured data out
You found the data you need inside an HTML <table> — in a page's source, a documentation example, a scraped fragment or a CMS export — and you want it as JSON to work with. Paste the table markup and this tool reads it the way a browser does: the header row (a <thead> row, or the first row if there is no head) becomes the object keys, and every following <tr> becomes one object in the array.
Types, not just strings
Cell text that looks like a number becomes a JSON number, true/false become booleans and null becomes null — so you don't get everything wrapped in quotes. Values that only look numeric but shouldn't be (a ZIP code with a leading zero, a long ID that would lose precision) are kept as strings. Empty cells become empty strings, and a blank header is named column1, column2… so the keys stay usable.
The other direction
Have JSON and need table markup for a page or email instead? JSON to HTML Table builds a clean, escaped <table>. For spreadsheet formats there's JSON to CSV and JSON to TSV, and to explore the result use the JSON tree viewer.
Frequently asked questions
Does the table need a <thead>?
No. If there is a <thead> row it is used for the column names; otherwise the first row of the table is treated as the header. Every remaining row becomes an object in the array.
Are numbers and booleans typed?
Yes — a cell that is a valid number becomes a JSON number, true/false become booleans and null becomes null. Numeric-looking values that would lose meaning as numbers (leading-zero codes, oversized IDs) are deliberately kept as strings.
What if the input has extra HTML around the table?
That is fine. The tool parses the input as HTML and picks the first <table> it finds, so you can paste a whole fragment or page section — surrounding markup is ignored.
What happens to merged or ragged cells?
Cells are matched to headers by position, so colspan/rowspan merges are not expanded — a row with fewer cells than headers gets empty strings for the missing columns. For clean tabular data it round-trips with JSON to HTML Table.