The JSON Export Keeps Three Things the CSV Has No Column For
Published 9/9/2026 · 3 min read · File tools
Daniel Okonkwo — Front-end developer and tech writer at OneKitly
Web performance · File formats
Checked against 3 sources
Both exports read the same .ics with the same parser, and then diverge on what they can carry. The CSV writes eight fixed columns — summary, start, end, location, description, organizer, status, uid — because a spreadsheet is a rectangle and every event has to fill the same one. The JSON writes each event as an object, so a field that only some events have simply appears on those. In practice that means three things survive the JSON and not the CSV: tzid, the named time zone a start was written in; allDay, the marker that says a date is a whole day rather than an instant; and rrule, the recurrence rule. A weekly meeting exported to JSON comes back with "rrule": "FREQ=WEEKLY;BYDAY=MO;COUNT=12" attached, and a Christmas entry with "allDay": true. Neither has anywhere to go in a table. Take the CSV to read and sort; take the JSON when a script, an import routine or another calendar is going to consume it.
Same file, same parser, two outputs. The spreadsheet gets eight columns; the JSON gets the named time zone, the all-day flag and the recurrence rule as well.
A rectangle against a shape
A CSV has to decide its columns before it writes its first row, and every row afterwards has exactly those. That is a strength when you want to sort by start date or count events per location — a spreadsheet does those things instantly and a nest of objects does not. It becomes a weakness the moment the data is irregular, and calendar data is irregular by nature: most events have no recurrence, a few do; most have a zone, all-day entries have none.
There is a second, smaller difference worth knowing when a script reads the output. In the CSV an empty field is an empty cell that is always there; in the JSON an optional field that has no value may be absent from the object altogether. Write your reader to treat a missing key and an empty string the same way and neither export will surprise you.
| Property | In the CSV | In the JSON |
|---|---|---|
| Title, start, end, uid | Yes, four of the eight columns | Yes |
| Named time zone | No column | "tzid": "Europe/Paris" |
| Whole day rather than an instant | No column | "allDay": true |
| Recurrence rule | No column | "rrule": "FREQ=WEEKLY;BYDAY=MO;COUNT=12" |
| An empty field | An empty cell, always present | An empty string, or the key is absent |
Frequently asked questions
- Can I turn the JSON back into a calendar?
- Not directly here — the import side takes CSV — but the JSON is the right thing to feed a script that writes .ics itself, precisely because it still holds the zone, the all-day flag and the rule. If all you need is to move a calendar unchanged, do not go through either export: merging .ics files keeps everything and skips the question.
- Does the JSON expand the recurring events?
- No, and it should not: it carries the rule instead, which is strictly more information. One object with an rrule of FREQ=WEEKLY;COUNT=12 tells you both that there are twelve occurrences and how they are spaced, while twelve expanded objects would tell you the dates and lose the fact that they belong together. Expanding is a job for whatever consumes the file.
- Which one should I archive?
- The .ics itself. Both exports are readings of it, and a reading always drops something — the JSON drops attendees, alarms and attachments just as the CSV drops the zone and the rule. Keep the original as the record and generate whichever export you need from it when you need it.
Articles you may find interesting
All guides →Related tools
Sources
Spotted a mistake in this article?