The fundamental mapping is intuitive. Given a JSON array like [{"id":1,"name":"Ada"},{"id":2,"name":"Babbage"}], the natural CSV is a two-row table with columns id and name. The converter scans every object in the array to compute the union of all keys present, so a record that has an extra field does not silently drop it, and a record missing a field gets an empty cell rather than a misaligned row. This union-of-keys approach is more forgiving than picking the keys from only the first object, which is what some simplistic converters do, and it matches what analysts expect when they ask for "all the data" rather than "the data the first record has".
Mixed schemas are common in real-world data. APIs evolve, optional fields appear in some records but not others, and pagination boundaries can introduce gaps. FixTools handles these gracefully by computing the column union before writing any rows. Empty cells stay empty rather than being filled with the string null or with a placeholder, which preserves the analyst's ability to use spreadsheet functions like ISBLANK and COUNTBLANK to detect coverage gaps. If you specifically want null cells to read as the literal text NULL, you can change that in the options panel.
Nested objects in array elements are flattened with dotted column names by default. A record { id: 1, address: { city: "London", zip: "EC1" } } produces columns id, address.city, and address.zip. This convention is widely understood across the data world. Pandas json_normalize uses it, jq paths produce the same shape, and BigQuery and Snowflake column names support it natively. If your downstream consumer prefers underscores to dots, you can switch the separator in the options.
Arrays inside array elements are the most ambiguous case. The default behaviour is to JSON-encode the inner array as a single cell, so tags: ["a", "b"] becomes the cell content ["a","b"]. This preserves information without exploding the row count. If your downstream tool needs each tag on its own row, switch the array handling option to Explode and the converter will duplicate parent fields across as many rows as the inner array has elements. Different consumers want different shapes here, so the converter exposes the choice explicitly rather than guessing.