Json To Vcf Converter

For users who don't code, online converters are the fastest route. However, privacy is a major concern here. Never upload sensitive contact lists (clients, personal family data) to random websites.

If you must use an online tool, here is what to look for:

Recommended Workflow for Non-Coders:

This method (JSON -> CSV -> Google Contacts -> VCF) is the most secure way to convert data without coding knowledge, as it leverages Google's trusted infrastructure.


If you have a large dataset (e.g., 1,000+ contacts) or need to automate the process, using a script is the most robust method. Python makes this incredibly easy.

Prerequisites: Python installed on your machine.

Maya built things that spoke to each other. json to vcf converter

In a cramped apartment that smelled faintly of coffee and solder, she balanced a laptop on her knees and a tiny thrift-store speaker on the windowsill. Her latest freelance job was deceptively simple on paper: convert a messy JSON export of contacts from an old CRM into a tidy VCF file a client’s phone could import. The client wanted “one-click” simplicity; the JSON was anything but.

The file arrived as a tangle of arrays and nested objects. Names lived under user.displayName, phone numbers nested in contacts.phones came in inconsistent formats—sometimes as strings, sometimes as objects with type fields. Emails had typos. Some contacts had addresses split into streetLine1 and line2, others had a single address string. A few records were duplicates, with different spellings and missing fields.

Maya sipped cold coffee and opened a blank script. She liked parsers because they were patient: rules you taught them they followed with no attitude. She began by sketching the workflow in a note app—normalize, dedupe, map fields, export.

Normalization meant cleaning phone numbers and emails. She wrote a small routine to strip non-digits and add country codes when missing, then another to trim whitespace and correct common domain typos—gamil.com became gmail.com, hotmial flipped to hotmail. For addresses she used a simple heuristic: if both streetLine1 and line2 existed, join them with a comma; if only a single address line existed, send it through as-is.

Mapping was the fun part. The VCF format had its own language—N: for name components, TEL;TYPE= for phones, EMAIL for emails, ADR;TYPE= for addresses. She wrote mapping rules that handled multiple numbers, with labels converted to VCF types (work, home, mobile). For notes and company fields that had no exact VCF counterpart, she tucked them into the NOTE property.

Duplicates were trickier. Maya created a scoring function that compared normalized names, primary phone, and email. If two records scored high, she merged them, preferring the longest non-empty fields and combining phone lists without repeating identical numbers. For users who don't code, online converters are

As the script took shape it produced tiny blocks of text that looked like postcards:

BEGIN:VCARD VERSION:3.0 N:Doe;Jane;;; FN:Jane Doe TEL;TYPE=CELL:+15551234567 EMAIL:jane.doe@gmail.com ADR;TYPE=HOME:;;123 Maple St.;Springfield;IL;62704;USA NOTE:Met at conference — follows up on project X END:VCARD

Maya smiled the way programmers smile when things run right—the quiet, private satisfaction of correct output. But one stubborn record failed validation: a name field full of emojis and an empty phone list. She debated deleting it; instead she logged it to a report and added a fallback: place the raw JSON blob into NOTE so nothing was lost.

By midnight she wrapped the converter into a tiny command-line tool with usage help and flags: --input, --output, --country-default. She wrote tests—small JSON snippets mapped to expected VCF strings—and automated them. The tool felt honest: it didn’t pretend every conversion would be perfect, but it tried, and it kept everything traceable.

The client’s phone accepted the VCF without fuss. They sent a single-line reply: “Amazing. Thank you.” Maya could tell from the brevity that the client was pleased but preoccupied, the best kind of compliment for her work.

She pushed the script to a private repository, then, on impulse, wrapped it in a tiny web interface so non-technical users could drag-and-drop a JSON file and get a VCF back. The interface was deliberately spare—one file drop zone, a dropdown for default country code, a click to download. Recommended Workflow for Non-Coders:

A week later an email arrived from a small nonprofit that had lost access to their donor database and rescued their contacts from a corrupted export. The VCF had restored names to phones that would otherwise have been stranded. “You saved us,” they wrote.

Maya closed her laptop and leaned back. Converters like hers were small acts of translation—turning fragmented data into something useful, restoring connections. In the quiet that followed, she imagined a world where more systems spoke the same language, where messy exports and missing fields were inconveniences rather than obstacles. For now, she had a little tool that made one kind of mess fade into order. That, she thought, was enough.


In the modern digital landscape, contact management is the backbone of business communication, marketing, and personal networking. Two file formats dominate this space: JSON (JavaScript Object Notation) for data interchange and VCF (vCard) for contact portability.

Raw JSON data is machine-readable and flexible, but it is useless on a phone. A VCF file is the universal standard for importing contacts into smartphones (iOS/Android), email clients (Outlook, Gmail), and CRMs.

This is where a JSON to VCF converter becomes essential. This article explores everything you need to know: why you need it, how it works, the risks of manual conversion, and the best tools to automate the process.

Below is a basic Python script to convert JSON to VCF:

import json
def convert_json_to_vcf(json_data, vcf_file_path):
    try:
        with open(vcf_file_path, 'w') as vcf_file:
            # VCF header
            vcf_file.write("##fileformat=VCFv4.2\n")
            vcf_file.write("##FORMAT=<ID=GT,Number=1,Type=String,Description=\"Genotype\">\n")
            vcf_file.write("#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tSAMPLE\n")
for variant in json_data:
                chrom = variant['CHROM']
                pos = variant['POS']
                id_ = variant['ID']
                ref = variant['REF']
                alt = ",".join(variant['ALT'])
                qual = variant['QUAL']
                filter_ = variant['FILTER']
                info = ";".join([f"key=value" for key, value in variant['INFO'].items()])
                format_ = variant['FORMAT']
                sample = variant['SAMPLE']['GT']
                genotype = f"sample[0]|sample[1]" if len(sample) > 1 else sample[0]
vcf_file.write(f"chrom\tpos\tid_\tref\talt\tqual\tfilter_\tinfo\tformat_\tgenotype\n")
print(f"Conversion successful. VCF file saved to: vcf_file_path")
    except Exception as e:
        print(f"An error occurred: e")
# Example JSON data
json_data = [
"CHROM": "chr1",
    "POS": 12345,
    "ID": "rs1234",
    "REF": "A",
    "ALT": ["T"],
    "QUAL": 100,
    "FILTER": "PASS",
    "INFO": 
      "AF": 0.5
    ,
    "FORMAT": "GT",
    "SAMPLE": 
      "GT": [0, 1]
]
# Save to file
convert_json_to_vcf(json_data, 'output.vcf')

Before you upload your JSON file to a random website, consider this:

import json
import vobject

def json_to_vcf(json_file_path, output_vcf_path, field_mapping=None): """ field_mapping example: "full_name": "FN", "mobile": "TEL", "email_address": "EMAIL", "job_title": "TITLE" """ with open(json_file_path, 'r') as f: contacts = json.load(f) # Expects a list of dicts

vcf_entries = []
for contact in contacts:
    vcard = vobject.vCard()
    for json_field, vcf_field in field_mapping.items():
        value = contact.get(json_field)
        if value:
            vcard.add(vcf_field)
            vcard.contents[vcf_field][0].value = str(value)
    vcf_entries.append(vcard.serialize())
with open(output_vcf_path, 'w') as f:
    f.writelines(vcf_entries)
print(f"Converted len(contacts) contacts to output_vcf_path")