Converters
vCard to JSON Converter
Turn a .vcf export into a predictable JSON array — structured names and addresses, typed phones and emails, every card in the file.
In short
Convert vCard (.vcf) contacts to JSON online. Parses vCard 2.1, 3.0 and 4.0 — names, phones, emails, addresses and TYPE parameters — into a clean array.
By NaveenKumar T · Updated
- Handles vCard 2.1, 3.0 and 4.0
- Splits structured N and ADR values into fields
- Keeps TYPE parameters on phones, emails and addresses
Runs entirely in your browser — nothing you paste or open here is uploaded, logged, or stored.How we handle data →
Example
vCard to JSON Converter: input and output
Two cards in one file: a vCard 2.1 export with bare parameters, quoted-printable accents and an embedded photo, followed by a minimal 4.0 card.
BEGIN:VCARD
VERSION:2.1
N:García;José;;Dr.;
FN:Dr. José García
ORG:Clínica Central;Cardiología
TEL;WORK;VOICE:+34 91 123 4567
TEL;CELL:+34 600 123 456
EMAIL;INTERNET:jose@example.es
ADR;WORK:;;Calle Mayor 15;Madrid;;28013;España
NOTE;ENCODING=QUOTED-PRINTABLE:Prefiere correo electr=C3=B3nico
PHOTO;ENCODING=BASE64;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAA
END:VCARD
BEGIN:VCARD
VERSION:4.0
FN:Amara Okafor
N:Okafor;Amara;;;
TITLE:Product Designer
EMAIL;TYPE=work:amara@example.com
URL:https://example.com/amara
END:VCARD[
{
"fullName": "Dr. José García",
"name": {
"family": "García",
"given": "José",
"additional": "",
"prefix": "Dr.",
"suffix": ""
},
"phones": [
{
"type": "work,voice",
"value": "+34 91 123 4567"
},
{
"type": "cell",
"value": "+34 600 123 456"
}
],
"emails": [
{
"type": "internet",
"value": "jose@example.es"
}
],
"addresses": [
{
"type": "work",
"street": "Calle Mayor 15",
"city": "Madrid",
"region": "",
"postalCode": "28013",
"country": "España"
}
],
"org": "Clínica Central, Cardiología",
"title": "",
"urls": [],
"birthday": "",
"note": "Prefiere correo electrónico",
"version": "2.1",
"photo": "omitted"
},
{
"fullName": "Amara Okafor",
"name": {
"family": "Okafor",
"given": "Amara",
"additional": "",
"prefix": "",
"suffix": ""
},
"phones": [],
"emails": [
{
"type": "work",
"value": "amara@example.com"
}
],
"addresses": [],
"org": "",
"title": "Product Designer",
"urls": [
"https://example.com/amara"
],
"birthday": "",
"note": "",
"version": "4.0"
}
]Both cards land in one array with identical keys. The 2.1 card's bare parameters become "type": "work,voice" and "type": "cell", its quoted-printable NOTE decodes back to "Prefiere correo electrónico", the structured ORG becomes "Clínica Central, Cardiología", and the base64 PHOTO is replaced by "photo": "omitted". The 4.0 card has no phones or addresses, so those arrays are simply empty.
Learn more
How vCard properties map to JSON
A vCard is a line-oriented format: each line is a property name, an optional list of parameters, and a value, and the whole card sits between BEGIN:VCARD and END:VCARD. Two of those values are structured rather than plain text. N carries five semicolon-separated components in a fixed order — family, given, additional, prefix, suffix — and ADR carries seven: post office box, extended address, street, locality, region, postal code and country. Splitting them correctly is most of what a converter has to get right, because a comma in "Ms. Ada Lovelace, PhD" is data and a semicolon is a separator.
The converter maps every card to one object. The structured name becomes a nested `name` object; the address components become `street`, `city`, `region`, `postalCode` and `country`, with the post office box and extended address folded into the street line when a card uses them. Repeatable properties — TEL, EMAIL, URL — become arrays in the order they appear, so a contact with a work line, a mobile and a fax keeps all three. Escaped characters are decoded on the way through: `\n` becomes a real line break, and `\,` and `\;` become literal commas and semicolons.
| vCard property | Example line | JSON result |
|---|---|---|
| FN | FN:Ms. Ada Lovelace | "fullName": "Ms. Ada Lovelace" |
| N | N:Lovelace;Ada;Augusta;Ms.; | "name": { "family": "Lovelace", "given": "Ada", "additional": "Augusta", "prefix": "Ms.", "suffix": "" } |
| TEL | TEL;TYPE=work,voice:+44 20 7946 0958 | "phones": [{ "type": "work,voice", "value": "+44 20 7946 0958" }] |
| EMAIL;TYPE=work:ada@example.com | "emails": [{ "type": "work", "value": "ada@example.com" }] | |
| ADR | ADR;TYPE=work:;;12 Marylebone Rd;London;;NW1 5JD;United Kingdom | "addresses": [{ "type": "work", "street": "12 Marylebone Rd", "city": "London", "region": "", "postalCode": "NW1 5JD", "country": "United Kingdom" }] |
| ORG | ORG:Analytical Engines Ltd.;Research | "org": "Analytical Engines Ltd., Research" |
| TITLE | TITLE:Chief Mathematician | "title": "Chief Mathematician" |
| URL | URL:https://example.com/ada | "urls": ["https://example.com/ada"] |
| BDAY | BDAY:1815-12-10 | "birthday": "1815-12-10" |
| PHOTO | PHOTO;ENCODING=BASE64;TYPE=JPEG:/9j/4AA… | "photo": "omitted" |
Version quirks the converter smooths over
vCard has been revised twice, and exporters disagree in ways that break naive parsers. Version 2.1 (RFC-era, still produced by older handsets and some Outlook exports) writes parameters without names — `TEL;WORK;VOICE:` and `EMAIL;INTERNET:` — and encodes accented characters as quoted-printable, so "electrónico" arrives as `electr=C3=B3nico`. Version 3.0 (RFC 2426) introduced the explicit `TYPE=` form and made FN mandatory. Version 4.0 (RFC 6350) allows quoted parameter lists such as `TYPE="work,voice"`, and writes telephone numbers as URIs: `VALUE=uri:tel:+1-202-555-0184`.
All of that is normalized here. Bare 2.1 parameters and 3.0/4.0 TYPE lists produce identical `type` strings; quoted-printable values are decoded back to UTF-8; a `tel:` or `mailto:` prefix is stripped so the value stays human-readable; and a quoted parameter containing a comma is not mistaken for a list separator. Property groups — the `item1.TEL` prefix Apple Contacts adds — are stripped, and the property name is matched case-insensitively, because exporters disagree about capitalization too.
A few things are intentionally left out. Vendor extensions (anything starting with `X-`), plus GEO, TZ, CATEGORIES, IMPP and REV, are skipped rather than dumped into the output; a PHOTO payload is dropped and flagged as described above, and LOGO is skipped entirely. If a file's last card is missing its END:VCARD — a common symptom of a truncated export — the contact is still converted rather than discarded. If the input contains no BEGIN:VCARD at all, you get an error instead of an empty array, so a wrong paste is obvious.
What to do with the JSON
The typical reason to convert a .vcf file is that something downstream speaks JSON: a CRM import, a seed file for a test database, a contact-merge script, or a deduplication pass over an address book that has drifted across three phones. Because the output is a flat array with a stable shape, it drops straight into `Array.prototype.map`, `jq`, a spreadsheet or a database import without any per-record special casing.
Two habits make the result much easier to work with. First, normalize phone numbers before you compare anything: vCard stores them exactly as the user typed them, so "+44 20 7946 0958", "020 7946 0958" and "+442079460958" are three spellings of one number, and any deduplication that skips this step will keep all three. Second, decide early which contact identity you trust — fullName is what the card displays, but the structured name object is what you sort and merge on, and plenty of exports fill in one without the other. The converter always gives you both: when a card has no FN, the display name is assembled from the structured components instead.
From here, format or re-indent the array, browse it as a tree in the JSON viewer to spot the contacts with missing fields, or push it through JSON to CSV for a spreadsheet. Everything runs in your browser — contact files are personal data, and this one never leaves the page.
Help
Frequently asked questions
Everything you need to know about the vCard to JSON Converter.
01Which vCard versions does the converter understand?
2.1, 3.0 and 4.0 — the three you will actually meet in the wild. 2.1 files (older phones, Outlook exports) use bare parameters like `TEL;WORK;VOICE:` and often quoted-printable text for accents; 3.0 (the format most address books export) uses `TYPE=work,voice`; 4.0 writes phone numbers as `tel:` URIs and may quote parameter lists. All three are normalized into the same JSON shape, and the card's declared version is kept in the `version` field.
02What happens to embedded photos?
They are deliberately dropped. A single PHOTO property can carry hundreds of kilobytes of base64 across dozens of folded lines, which would swamp the readable output. When a card contains one, the converter adds `"photo": "omitted"` to that contact so you know an image was there — every other property is converted normally.
03Why do contacts have empty strings instead of missing fields?
Because a predictable shape is easier to consume. Every contact carries the same keys — fullName, name, phones, emails, addresses, org, title, urls, birthday, note, version — with empty strings and empty arrays where the card said nothing. Downstream code can read `contact.org` without optional chaining, and a CSV or spreadsheet built from the array gets consistent columns.
04How are TYPE parameters converted?
Each phone, email and address becomes `{ "type": …, "value": … }`, where type is the parameter list lowercased and comma-joined: `TEL;TYPE=work,voice:` gives `"work,voice"`, and the vCard 2.1 form `TEL;WORK;VOICE:` gives exactly the same result. Transfer-encoding parameters such as ENCODING and CHARSET are never mistaken for types, and a property with no type at all gets an empty string.
05What if a line wraps across several lines in the file?
It is joined back together first. The vCard specification folds long values by breaking them and starting the continuation with a single space or tab, and vCard 2.1 quoted-printable values continue after a trailing `=`. Both forms are unfolded before parsing, so a wrapped NOTE or ADR arrives intact rather than being cut in half.
06Can I turn the result into a spreadsheet?
Yes — the output is a flat array of contact objects, which is exactly what the [JSON to CSV](/json-to-csv) converter expects. Nested groups such as phones and addresses are arrays, so decide how many columns you want (first phone only, or one row per phone) before converting.
Keep working
Related tools
CSV to JSON
Converters
JSON to CSV
Converters
JSON Formatter
Format, beautify, and validate JSON instantly in a professional VS Code-style editor — free, fast, and 100% private.
JSON Viewer
Explore any JSON document in an interactive, collapsible tree — keys, types, and counts at a glance, with code view one click away.
String to JSON
Converters
TOML to JSON
Converters