One document matched: draft-ietf-appsawg-json-merge-patch-07.xml
<?xml version="1.0"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc5789 PUBLIC '' 'reference.RFC.5789.xml'>
<!ENTITY rfc7159 PUBLIC '' 'reference.RFC.7159.xml'>
]>
<?rfc toc="yes"?>
<?rfc strict="yes"?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes"?>
<?rfc compact="yes"?>
<rfc category="std" ipr="trust200902" docName="draft-ietf-appsawg-json-merge-patch-07">
<front>
<title abbrev="application/merge-patch">
JSON Merge Patch
</title>
<author fullname="Paul Hoffman" initials="P." surname="Hoffman">
<organization>VPN Consortium</organization>
<address>
<email>paul.hoffman@vpnc.org</email>
</address>
</author>
<author initials="J.M." surname="Snell" fullname="James M Snell">
<address>
<email>jasnell@gmail.com</email>
</address>
</author>
<date />
<area>General</area>
<workgroup>Applications Area Working Group</workgroup>
<keyword>I-D</keyword>
<keyword>http</keyword>
<keyword>json</keyword>
<keyword>patch</keyword>
<keyword>merge</keyword>
<abstract>
<t>
This specification defines the JSON merge patch format and processing
rules.
The merge patch format is primarily intended for use with the HTTP PATCH method as a means
of describing a set of modifications to a target resource's content.
</t>
</abstract>
</front>
<middle>
<section anchor="intro" title="Introduction">
<t>
This specification defines the JSON merge patch document
format, processing rules, and associated MIME media type identifier.
The merge patch format is primarily intended for use with the
HTTP PATCH method <xref target="RFC5789"/> as a means of describing
a set of modifications to a target resource's content.
</t>
<t>
A JSON merge patch document describes changes to be made to a target
JSON document using a syntax that closely mimics the document being
modified. Recipients of a merge patch document determine the exact
set of changes being requested by comparing the content of the provided
patch against the current content of the target document. If the
provided merge patch contains members that do not appear within the
target, those members are added. If the target does contain the member,
the value is replaced. Null values in the merge patch are given
special meaning to indicate the removal of existing values in the target.
</t>
<figure><preamble>For example, given the following original JSON document:</preamble><artwork>
{
"a": "b",
"c": {
"d": "e",
"f": "g"
}
}
</artwork></figure>
<figure><preamble>Changing the value of "a" and removing "f" can be achieved by sending:</preamble><artwork>
PATCH /target HTTP/1.1
Host: example.org
Content-Type: application/merge-patch+json
{
"a":"z",
"c": {
"f": null
}
}
</artwork></figure>
<t>
When applied to the target resource, the value of the "a" member
is replaced with "z" and "f" is removed, leaving the remaining content
untouched.
</t>
<t>
This design means that merge patch documents are suitable for describing
modifications to JSON documents that primarily use objects for their
structure and do not make use of explicit null values. The merge
patch format is not appropriate for all JSON syntaxes.
</t>
</section>
<section title="Processing Merge Patch Documents" anchor="json-merge-patch">
<t>
JSON merge patch documents describe, by example, a set of changes that
are to be made to a target resource. Recipients of merge patch
documents are responsible for comparing the merge patch with
the current content of the target resource to determine the specific
set of change operations to be applied to the target.
</t>
<t>
To apply the merge patch document to a target resource, the system realizes the effect of the
following function, described in pseudocode. For this description, the function is
called MergePatch, and it takes two arguments: the target resource document and the
merge patch document. The Target argument can be any JSON value, or undefined.
The Patch argument can be any JSON value.
</t>
<figure><artwork>
define MergePatch(Target, Patch):
if Patch is an Object:
if Target is not an Object:
Target = {} # Ignore the contents and set it to an empty Object
for each Name/Value pair in Patch:
if Value is null:
if Name exists in Target:
remove the Name/Value pair from Target
else:
Target[Name] = MergePatch(Target[Name], Value)
return Target
else:
return Patch
</artwork></figure>
<t>
There are a few things to note about the function. If the patch is anything other than an object,
the result will always be to replace the entire target with the entire patch. Also, it is not
possible to patch part of a target that is not an object, such as to replace just some if the values
in an array.
</t>
<t>
The MergePatch operation is defined to operate at the level of data items, not at the level of textual
representation. There is no expectation that the MergePatch operation will preserve textual
representation-level features such as white space, member ordering, number precision beyond what is available
in the target's implementation, and so forth. In addition, even if the target implementation allows multiple
name/value pairs with the same name, the result of the patch operation on such objects is not defined.
</t>
</section>
<section title="Example" anchor="example">
<figure><preamble>For example, given the following example JSON document:</preamble>
<artwork>
{
"title": "Goodbye!",
"author" : {
"givenName" : "John",
"familyName" : "Doe"
},
"tags":[ "example", "sample" ],
"content": "This will be unchanged"
}
</artwork></figure>
<t>
A user-agent wishing to change the value of the "title" member from
"Goodbye!" to the value "Hello!", add a new "phoneNumber" member,
remove the "familyName" member from the "author" object, and replace
the "tags" Array so that it doesn't include the word "sample", would
send the following request:
</t>
<figure><artwork>
PATCH /my/resource HTTP/1.1
Host: example.org
Content-Type: application/merge-patch+json
{
"title": "Hello!",
"phoneNumber": "+01-123-456-7890",
"author": {
"familyName": null
},
"tags": [ "example" ]
}
</artwork></figure>
<figure><preamble>The resulting JSON document would be:</preamble><artwork>
{
"title": "Hello!",
"author" : {
"givenName" : "John"
},
"tags": [ "example" ],
"content": "This will be unchanged",
"phoneNumber": "+01-123-456-7890"
}
</artwork></figure>
</section>
<section title="IANA Considerations">
<t>This specification registers the following additional
MIME Media Types:</t>
<t><list>
<t>Type name: application</t>
<t>Subtype name: merge-patch+json</t>
<t>Required parameters: None</t>
<t>Optional parameters: None</t>
<t>Encoding considerations: Resources that use the "application/merge-patch+json"
media type are required to conform to the "application/json" Media Type
and are therefore subject to the same encoding considerations
specified in Section 8 of <xref target="RFC7159"/>.</t>
<t>Security considerations: As defined in this specification</t>
<t>Published specification: This specification.</t>
<t>Applications that use this media type: None currently known.</t>
<t>Additional information:
<list>
<t>Magic number(s): N/A</t>
<t>File extension(s): N/A</t>
<t>Macintosh file type code(s): TEXT</t>
</list></t>
<t>Person & email address to contact for further information: IESG</t>
<t>Intended usage: COMMON</t>
<t>Restrictions on usage: None.</t>
<t>Author: James M Snell <jasnell@gmail.com></t>
<t>Change controller: IESG</t>
</list></t>
</section>
<section title="Security Considerations">
<t>
The "application/merge-patch+json" Media Type allows user agents to
indicate their intention that the server determine the specific set of
change operations to be applied to a target resource. As such,
it is the server's responsibility to determine the appropriateness
of any given change as well as the user agent's authorization to
request such changes. How such determinations are made is considered
out of the scope of this specification.
</t>
<t>
All of the the security considerations discussed in Section 5 of
<xref target="RFC5789"/> apply to all uses of the
HTTP PATCH method with the "application/merge-patch+json" Media Type.
</t>
</section>
<section title="Acknowledgements">
<t>Many people contributed significant ideas to this document. These people
include, but are not limited to, James Manger, Matt Miller, Carsten
Bormann, and Bjoern Hoehrmann, Pete Resnick, and Richard Barnes.</t>
</section>
</middle>
<back>
<references title="Normative References">
&rfc7159;
</references>
<references title="Informative References">
&rfc5789;
</references>
<section title="Example Test Cases">
<figure><artwork>
ORIGINAL PATCH RESULT
------------------------------------------
{"a":"b"} {"a":"c"} {"a":"c"}
{"a":"b"} {"b":"c"} {"a":"b",
"b":"c"}
{"a":"b"} {"a":null} {}
{"a":"b", {"a":null} {"b":"c"}
"b":"c"}
{"a":["b"]} {"a":"c"} {"a":"c"}
{"a":"c"} {"a":["b"]} {"a":["b"]}
{"a": { {"a": { {"a": {
"b": "c"} "b": "d", "b": "d"
} "c": null} }
} }
{"a": [ {"a": [1]} {"a": [1]}
{"b":"c"}
]
}
["a","b"] ["c","d"] ["c","d"]
{"a":"b"} ["c"] ["c"]
{"a":"foo"} null null
{"a":"foo"} "bar" "bar"
{"e":null} {"a":1} {"e":null,
"a":1}
[1,2] {"a":"b", {"a":"b"}
"c":null}
{} {"a": {"a":
{"bb": {"bb":
{"ccc": {}}}
null}}}
</artwork></figure>
</section>
</back>
</rfc>
| PAFTECH AB 2003-2026 | 2026-04-24 06:44:20 |