Convert a plist to JSON by mapping each property list type to its JSON equivalent: dictionaries become objects, arrays stay arrays, and dates and raw data become strings because JSON has no type for them. FindUtils Plist JSON Converter does this in your browser for XML plists and binary bplist00 files, lists every date and data value it turned into a string, and writes JSON back to an XML plist. Nothing is uploaded.

This guide explains what a property list holds, how each type maps to JSON, how to read a binary plist, what changes when JSON goes back to a plist, and why plutil -convert json often fails.

What Is a Plist File?

A plist, or property list, is Apple's file format for structured data. macOS and iOS use it for the Info.plist metadata inside every app bundle, for preference files in ~/Library/Preferences, and for .mobileconfig configuration profiles. A property list holds eight kinds of value: dictionaries, arrays, strings, integers, reals, booleans, dates and data.

The same property list can be saved in two formats:

FormatHow it startsWhere you meet it
XML plist<?xml ...?> and <plist version="1.0">Info.plist in source code, .mobileconfig profiles, hand-edited files
Binary plistThe eight bytes bplist00Preference files, many compiled app bundles, .webloc link files

Apple's CoreFoundation source, CFBinaryPList.c, documents the binary layout in its comments: a bplist00 header, the objects, an offset table and a 32-byte trailer that points at the top object. Our test plist of 35 values took 1,327 bytes as XML and 546 bytes after plutil -convert binary1.

How Do Plist Types Map to JSON?

Plist typeJSON resultExample
<dict>Object, keys in file order{"CFBundleVersion": 42}
<array>Array["UIInterfaceOrientationPortrait"]
<string>String"com.example.notes"
<integer>Number, or a string when too large42, "18446744073709551615"
<real>Number0.75
<true/>, <false/>Booleantrue
<date>ISO 8601 string"2024-03-01T09:30:00Z"
<data>Base64 string, or a byte count"AAECA/8="
UID (keyed archives)Object{"CF$UID": 5}

JSON numbers are exact only up to 9,007,199,254,740,991. A plist integer beyond that, such as an unsigned 64-bit value, is written as a JSON string with every digit, and the conversion notes name its path. Dates and data are also listed by path, so a reader of the JSON knows which strings were not strings in the plist.

How to Convert a Plist to JSON

  1. Open Plist JSON Converter with Plist → JSON selected.
  2. Paste an XML plist, or upload a .plist, .mobileconfig or .webloc file. A binary plist is recognised from its bplist00 header and read as bytes.
  3. Choose 2 or 4 spaces of indentation, and whether <data> appears as base64 or as its size only.
  4. Read the conversion notes, then copy or download the JSON.

A short XML plist:

XML
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<class="text-rose-400">plist version="1.0">
<class="text-rose-400">dict>
	<class="text-rose-400">key>CFBundleIdentifier</class="text-rose-400">key>
	<class="text-rose-400">string>com.example.fieldnotes</class="text-rose-400">string>
	<class="text-rose-400">key>CFBundleVersion</class="text-rose-400">key>
	<class="text-rose-400">integer>318</class="text-rose-400">integer>
	<class="text-rose-400">key>BuildDate</class="text-rose-400">key>
	<class="text-rose-400">date>2026-09-17T08:00:00Z</class="text-rose-400">date>
</class="text-rose-400">dict>
</class="text-rose-400">plist>

converts to:

JSON
1
2
3
4
5
{
  "CFBundleIdentifier": "com.example.fieldnotes",
  "CFBundleVersion": 318,
  "BuildDate": "2026-09-17T08:00:00Z"
}

with the note that $.BuildDate was a <date>.

How Do You Read a Binary Plist?

Read a binary plist as a file, never as pasted text. Copying binary bytes through the clipboard or a text editor replaces the bytes that are not valid text, which damages the offset table the format depends on. Upload the file instead; the converter shows a note in place of the unreadable bytes and decodes them directly.

The binary reader decodes UTF-16 strings, 64-bit and larger integers, dates counted in seconds from 1 January 2001, sets and keyed-archive UIDs. It checks every offset against the file size and stops at reference cycles and at nesting deeper than 512 levels, so a damaged or hostile file produces an error message instead of a frozen tab.

How Do You Convert JSON Back to a Plist?

Choose JSON → Plist and paste a JSON object or array. The output is an XML plist 1.0 with Apple's DOCTYPE and tab indentation.

JSON valuePlist result
Object<dict>, keys in the order written
Whole number, such as 2<integer>
Number with a decimal point or exponent, such as 2.0<real>
String shaped like 2026-09-17T08:00:00Z<date>, when ISO dates become <date> is on
String starting with base64:<data>, when that option is on
true, false<true/>, <false/>
nullRefused, with the path of the value

Plists have no null, so a null anywhere stops the conversion with its location, such as $.settings.proxy. XML plist dates have whole seconds, so a fraction such as .250 is dropped and noted. The converter writes XML only; plutil -convert binary1 file.plist turns the result into a binary plist if a tool needs one.

Why Does plutil -convert json Fail?

plutil -convert json fails when the property list contains a value with no JSON type. On macOS, a plist holding a <date> or a <data> value stops the conversion with the error invalid object in plist for destination format. We reproduced it on macOS 15.7 with one plist holding only a date and another holding only data.

ApproachReads binaryDates and dataNeeds
plutil -convert jsonYesFailsA Mac
plutil -p file.plistYesPrints them, but the output is not JSONA Mac
Python plistlib plus json.dumpsYesNeeds a custom encoder for datetime and bytesPython
Plist JSON ConverterYesISO strings and base64, listed by pathA browser

Common Mistakes

Pasting a binary plist. The clipboard damages binary data. Upload the file, or on a Mac run plutil -convert xml1 first and paste the XML.

Trying an OpenStep plist. Files written as { key = value; } use the older NeXTSTEP text format, which is neither XML nor JSON. The converter recognises it and suggests plutil -convert xml1.

Uploading a signed .mobileconfig. A signed configuration profile wraps the plist in a CMS signature. Export an unsigned copy of the profile and convert that.

Expecting 2.0 to survive as a JSON number. JSON has one number type. A <real> of 2 becomes 2 in JSON, and converting back writes <integer>2</integer> unless the JSON says 2.0.

Tools Used in This Guide

ToolUse
Plist JSON ConverterConvert XML and binary plists to JSON, and JSON to an XML plist
JSON FormatterFormat or validate the JSON before converting it back
JSON YAML ConverterTurn the JSON into YAML for a config file
INI JSON ConverterDo the same for Windows and Linux INI configs

FAQ

Can I open a plist file on Windows?

Yes. An XML plist opens in any text editor, and a binary plist can be uploaded to Plist JSON Converter, which reads both formats in the browser without Xcode or plutil.

What is the difference between an XML and a binary plist?

They store the same values. XML is readable text with a <key> element before each dictionary value; binary starts with bplist00, can store a repeated value once, and locates every value through an offset table, which makes it smaller. Our 35-value test file was 1,327 bytes as XML and 546 bytes as binary.

What does CF$UID mean in the JSON?

{"CF$UID": 5} is a reference inside a keyed archive, the format NSKeyedArchiver writes. The number is the index of another object in the archive's $objects array.

Is my plist uploaded?

No. The file is parsed and converted in your browser tab. Info.plist files and profiles can contain identifiers, server addresses and certificates, which is why nothing is sent anywhere.

Sources

Next Steps

Convert a file with Plist JSON Converter. If the plist came inside a ZIP from a Mac, remove the __MACOSX folder first with Clean ZIP.