jCard and jCal

Since version 3.1, there's now native support for parsing and generating the jCal and jCard formats.

These new formats use JSON to serialize vCard and iCalendar. It is possible to exactly map iCalendar and vCard to jCal and jCard, and therefore you can convert back and forward, without any data-loss.


The exact grammar of both vCard and iCalendar is very vague, not really shared with other common formats, changes over time, complex and a lot of incorrect implementations exist.

jCard and jCal do not have this problem. It's our opinion that these two formats represent the future of this data, and we'd highly recommend people using this, and only using vCard / iCalendar for backwards compatibility purposes.

It's also often faster to parse and generate, and in PHP this is especially true.

Generating a jCal or jCard object

Any time you have a reference to a VCARD or VCALENDAR object in vobject, you can simply call ->jsonSerialize() to get a representation suitable for json.

Here's an example of parsing an iCalendar object, and then outputting it as a jCal object:

$vcal = \Sabre\VObject\Reader::read(fopen('my_calendar.ics', 'r'));
echo json_encode($vcal->jsonSerialize());

This feature was added in sabre/vobject 3.0.

Parsing jCal and jCard

To parse a jCard or jCal object, use the following snippet:

$input = 'jcard.json';
$jCard = VObject\Reader::readJson(fopen('jcard.json', 'r'));

You can pass either a JSON string, a readable stream, or an array if you already called json_decode on the input.

This feature was added in sabre/vobject 3.1.