---
url: https://findutils.com/guides/plist-to-json
title: "How to Convert a Plist File to JSON (XML and Binary)"
description: "Convert an Apple property list to JSON and back: Info.plist, preferences and .mobileconfig files, XML or binary. See how dates, data and big integers map, and why plutil -convert json fails."
category: developer
content_type: guide
guide_type: subtopic
cluster: config
locale: en
read_time: 8
status: published
author: "olgunozoktas"
published_at: 2026-09-17T12:00:00Z
excerpt: "A plist can be XML or binary, and it holds dates and raw data that JSON has no type for. Here is how each plist type maps to JSON, how to read a binary bplist file, and what changes on the way back."
tag_ids: ["config", "json", "data-conversion", "developer-tools"]
tags: ["Config", "JSON", "Data Conversion", "Developer Tools"]
primary_keyword: "plist to json"
secondary_keywords: ["convert plist to json", "binary plist to json", "json to plist", "info.plist to json", "bplist to json", "plutil convert json"]
tool_tag: "plist-json-converter"
related_tool: "plist-json-converter"
related_tools: ["plist-json-converter", "ini-json-converter", "json-yaml-converter", "json-formatter", "xml-formatter"]
og_image: "/images/content/guides/plist-to-json-cover-20260917.webp"
image_alt: "Blank cream cards, each held by a brass binder clip, laid in a grid on an oak desk beside an acrylic tray of clipped card stacks."
updated_at: "2026-09-17T12:00:00Z"
---

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](/developers/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:

| Format | How it starts | Where you meet it |
|---|---|---|
| XML plist | `<?xml ...?>` and `<plist version="1.0">` | Info.plist in source code, .mobileconfig profiles, hand-edited files |
| Binary plist | The eight bytes `bplist00` | Preference files, many compiled app bundles, `.webloc` link files |

Apple's CoreFoundation source, [CFBinaryPList.c](https://github.com/apple-oss-distributions/CF/blob/main/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 type | JSON result | Example |
|---|---|---|
| `<dict>` | Object, keys in file order | `{"CFBundleVersion": 42}` |
| `<array>` | Array | `["UIInterfaceOrientationPortrait"]` |
| `<string>` | String | `"com.example.notes"` |
| `<integer>` | Number, or a string when too large | `42`, `"18446744073709551615"` |
| `<real>` | Number | `0.75` |
| `<true/>`, `<false/>` | Boolean | `true` |
| `<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](/developers/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
<?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">
<plist version="1.0">
<dict>
	<key>CFBundleIdentifier</key>
	<string>com.example.fieldnotes</string>
	<key>CFBundleVersion</key>
	<integer>318</integer>
	<key>BuildDate</key>
	<date>2026-09-17T08:00:00Z</date>
</dict>
</plist>
```

converts to:

```json
{
  "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 value | Plist 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 &lt;date&gt;** is on |
| String starting with `base64:` | `<data>`, when that option is on |
| `true`, `false` | `<true/>`, `<false/>` |
| `null` | Refused, 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.

| Approach | Reads binary | Dates and data | Needs |
|---|---|---|---|
| `plutil -convert json` | Yes | Fails | A Mac |
| `plutil -p file.plist` | Yes | Prints them, but the output is not JSON | A Mac |
| Python [plistlib](https://docs.python.org/3/library/plistlib.html) plus `json.dumps` | Yes | Needs a custom encoder for `datetime` and `bytes` | Python |
| [Plist JSON Converter](/developers/plist-json-converter/) | Yes | ISO strings and base64, listed by path | A 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

| Tool | Use |
|---|---|
| [Plist JSON Converter](/developers/plist-json-converter/) | Convert XML and binary plists to JSON, and JSON to an XML plist |
| [JSON Formatter](/developers/json-formatter/) | Format or validate the JSON before converting it back |
| [JSON YAML Converter](/developers/json-yaml-converter/) | Turn the JSON into YAML for a config file |
| [INI JSON Converter](/developers/ini-json-converter/) | Do 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](/developers/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

- Apple Developer, [Information Property List](https://developer.apple.com/documentation/bundleresources/information-property-list).
- Apple Developer, [PropertyListSerialization](https://developer.apple.com/documentation/foundation/propertylistserialization).
- Apple Open Source, [CFBinaryPList.c](https://github.com/apple-oss-distributions/CF/blob/main/CFBinaryPList.c), the binary plist format comments.
- Python documentation, [plistlib: Generate and parse Apple .plist files](https://docs.python.org/3/library/plistlib.html).
- `plutil(1)` manual page on macOS.

## Next Steps

Convert a file with [Plist JSON Converter](/developers/plist-json-converter/). If the plist came inside a ZIP from a Mac, remove the `__MACOSX` folder first with [Clean ZIP](/convert/clean-zip/).
