Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.


Produce and apply json-patch objects.

Implements IETF JSON-patch (RFC 6902) and JSON-pointer (RFC 6901):

Using with Composer

To use this library as a Composer dependency in your project, include the following sections in your project's composer.json file:

    "repositories": [
            "type": "vcs",
            "url": ""
    "require": {
        "mikemccabe/json-patch-php": "dev-master"

Then, in your project's code, use the JsonPatch class definition from the mikemccabe\JsonPatch namespace like so:

use mikemccabe\JsonPatch\JsonPatch;

Entry points

  • JsonPatch::get($doc, $pointer) - get a value from a json document
  • JsonPatch::patch($doc, $patches) - apply patches to $doc and return result
  • JsonPatch::diff($src, $dst) - return patches to create $dst from $src

Arguments are PHP arrays, i.e. the output of json_decode($json_string, 1)

(Note that you MUST pass 1 as the second argument to json_decode to get an array. This library does not work with stdClass objects.)

All structures are implemented directly as PHP arrays. An array is considered to be 'associative' (e.g. like a JSON 'object') if it contains at least one non-numeric key.

Because of this, empty arrays ([]) and empty objects ({}) compare the same, and (for instance) an 'add' of a string key to an empty array will succeed in this implementation where it might fail in others.

$simplexml_mode is provided to help with working with arrays produced from XML in the style of simplexml - e.g. repeated XML elements are expressed as arrays. When $simplexml_mode is enabled, leaves with scalar values are implicitly treated as length-1 arrays, so this test will succeed:

{ "comment": "basic simplexml array promotion",
  "doc": { "foo":1 },
  "patch": [ { "op":"add", "path":"/foo/1", "value":2 } ],
  "expected": { "foo":[1, 2] } },

Also, when $simplexml_mode is true, 1-length arrays are converted to scalars on return from patch().


Some tests are in a submodule ( Do 'git submodule init' to pull these, then 'php runtests.php' to run them.

Build Status