| rfc7386.original | rfc7396.txt | |||
|---|---|---|---|---|
| Applications Area Working Group P. Hoffman | Internet Engineering Task Force (IETF) P. Hoffman | |||
| Internet-Draft VPN Consortium | Request for Comments: 7396 VPN Consortium | |||
| Intended status: Standards Track J. Snell | Obsoletes: 7386 J. Snell | |||
| Expires: February 22, 2015 | Category: Standards Track | |||
| August 21, 2014 | ISSN: 2070-1721 October 2014 | |||
| JSON Merge Patch | JSON Merge Patch | |||
| draft-ietf-appsawg-json-merge-patch-07 | ||||
| Abstract | Abstract | |||
| This specification defines the JSON merge patch format and processing | This specification defines the JSON merge patch format and processing | |||
| rules. The merge patch format is primarily intended for use with the | 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 | HTTP PATCH method as a means of describing a set of modifications to | |||
| a target resource's content. | a target resource's content. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 5741. | ||||
| This Internet-Draft will expire on February 22, 2015. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| http://www.rfc-editor.org/info/rfc7396. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2014 IETF Trust and the persons identified as the | Copyright (c) 2014 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 12 | skipping to change at page 2, line 12 | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
| 2. Processing Merge Patch Documents . . . . . . . . . . . . . . 3 | 2. Processing Merge Patch Documents . . . . . . . . . . . . . . 3 | |||
| 3. Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 3. Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 5 | 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 5. Security Considerations . . . . . . . . . . . . . . . . . . . 6 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 6 | |||
| 6. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 6 | 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 6.1. Normative References . . . . . . . . . . . . . . . . . . 7 | |||
| 7.1. Normative References . . . . . . . . . . . . . . . . . . 6 | 6.2. Informative References . . . . . . . . . . . . . . . . . 7 | |||
| 7.2. Informative References . . . . . . . . . . . . . . . . . 7 | Appendix A. Example Test Cases . . . . . . . . . . . . . . . . . 8 | |||
| Appendix A. Example Test Cases . . . . . . . . . . . . . . . . . 7 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 9 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 1. Introduction | 1. Introduction | |||
| This specification defines the JSON merge patch document format, | This specification defines the JSON merge patch document format, | |||
| processing rules, and associated MIME media type identifier. The | processing rules, and associated MIME media type identifier. The | |||
| merge patch format is primarily intended for use with the HTTP PATCH | merge patch format is primarily intended for use with the HTTP PATCH | |||
| method [RFC5789] as a means of describing a set of modifications to a | method [RFC5789] as a means of describing a set of modifications to a | |||
| target resource's content. | target resource's content. | |||
| skipping to change at page 2, line 40 | skipping to change at page 2, line 40 | |||
| set of changes being requested by comparing the content of the | set of changes being requested by comparing the content of the | |||
| provided patch against the current content of the target document. | provided patch against the current content of the target document. | |||
| If the provided merge patch contains members that do not appear | If the provided merge patch contains members that do not appear | |||
| within the target, those members are added. If the target does | within the target, those members are added. If the target does | |||
| contain the member, the value is replaced. Null values in the merge | contain the member, the value is replaced. Null values in the merge | |||
| patch are given special meaning to indicate the removal of existing | patch are given special meaning to indicate the removal of existing | |||
| values in the target. | values in the target. | |||
| For example, given the following original JSON document: | For example, given the following original JSON document: | |||
| { | { | |||
| "a": "b", | "a": "b", | |||
| "c": { | "c": { | |||
| "d": "e", | "d": "e", | |||
| "f": "g" | "f": "g" | |||
| } | ||||
| } | } | |||
| } | ||||
| Changing the value of "a" and removing "f" can be achieved by | Changing the value of "a" and removing "f" can be achieved by | |||
| sending: | sending: | |||
| PATCH /target HTTP/1.1 | PATCH /target HTTP/1.1 | |||
| Host: example.org | Host: example.org | |||
| Content-Type: application/merge-patch+json | Content-Type: application/merge-patch+json | |||
| { | { | |||
| "a":"z", | "a":"z", | |||
| "c": { | "c": { | |||
| "f": null | "f": null | |||
| } | ||||
| } | } | |||
| } | ||||
| When applied to the target resource, the value of the "a" member is | When applied to the target resource, the value of the "a" member is | |||
| replaced with "z" and "f" is removed, leaving the remaining content | replaced with "z" and "f" is removed, leaving the remaining content | |||
| untouched. | untouched. | |||
| This design means that merge patch documents are suitable for | This design means that merge patch documents are suitable for | |||
| describing modifications to JSON documents that primarily use objects | describing modifications to JSON documents that primarily use objects | |||
| for their structure and do not make use of explicit null values. The | for their structure and do not make use of explicit null values. The | |||
| merge patch format is not appropriate for all JSON syntaxes. | merge patch format is not appropriate for all JSON syntaxes. | |||
| skipping to change at page 3, line 40 | skipping to change at page 3, line 39 | |||
| JSON merge patch documents describe, by example, a set of changes | JSON merge patch documents describe, by example, a set of changes | |||
| that are to be made to a target resource. Recipients of merge patch | that are to be made to a target resource. Recipients of merge patch | |||
| documents are responsible for comparing the merge patch with the | documents are responsible for comparing the merge patch with the | |||
| current content of the target resource to determine the specific set | current content of the target resource to determine the specific set | |||
| of change operations to be applied to the target. | of change operations to be applied to the target. | |||
| To apply the merge patch document to a target resource, the system | To apply the merge patch document to a target resource, the system | |||
| realizes the effect of the following function, described in | realizes the effect of the following function, described in | |||
| pseudocode. For this description, the function is called MergePatch, | pseudocode. For this description, the function is called MergePatch, | |||
| and it takes two arguments: the target resource document and the | and it takes two arguments: the target resource document and the | |||
| merge patch document. The Target argument can be any JSON value, or | merge patch document. The Target argument can be any JSON value or | |||
| undefined. The Patch argument can be any JSON value. | undefined. The Patch argument can be any JSON value. | |||
| define MergePatch(Target, Patch): | define MergePatch(Target, Patch): | |||
| if Patch is an Object: | if Patch is an Object: | |||
| if Target is not an Object: | if Target is not an Object: | |||
| Target = {} # Ignore the contents and set it to an empty Object | Target = {} # Ignore the contents and set it to an empty Object | |||
| for each Name/Value pair in Patch: | for each Name/Value pair in Patch: | |||
| if Value is null: | if Value is null: | |||
| if Name exists in Target: | if Name exists in Target: | |||
| remove the Name/Value pair from Target | remove the Name/Value pair from Target | |||
| else: | else: | |||
| Target[Name] = MergePatch(Target[Name], Value) | Target[Name] = MergePatch(Target[Name], Value) | |||
| return Target | return Target | |||
| else: | else: | |||
| return Patch | return Patch | |||
| There are a few things to note about the function. If the patch is | 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 | 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 | 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 | patch part of a target that is not an object, such as to replace just | |||
| some if the values in an array. | some of the values in an array. | |||
| The MergePatch operation is defined to operate at the level of data | The MergePatch operation is defined to operate at the level of data | |||
| items, not at the level of textual representation. There is no | items, not at the level of textual representation. There is no | |||
| expectation that the MergePatch operation will preserve textual | expectation that the MergePatch operation will preserve features at | |||
| representation-level features such as white space, member ordering, | the textual-representation level such as white space, member | |||
| number precision beyond what is available in the target's | ordering, number precision beyond what is available in the target's | |||
| implementation, and so forth. In addition, even if the target | implementation, and so forth. In addition, even if the target | |||
| implementation allows multiple name/value pairs with the same name, | implementation allows multiple name/value pairs with the same name, | |||
| the result of the patch operation on such objects is not defined. | the result of the MergePatch operation on such objects is not | |||
| defined. | ||||
| 3. Example | 3. Example | |||
| For example, given the following example JSON document: | Given the following example JSON document: | |||
| { | ||||
| "title": "Goodbye!", | ||||
| "author" : { | ||||
| "givenName" : "John", | ||||
| "familyName" : "Doe" | ||||
| }, | ||||
| "tags":[ "example", "sample" ], | ||||
| "content": "This will be unchanged" | ||||
| } | ||||
| A user-agent wishing to change the value of the "title" member from | { | |||
| "title": "Goodbye!", | ||||
| "author" : { | ||||
| "givenName" : "John", | ||||
| "familyName" : "Doe" | ||||
| }, | ||||
| "tags":[ "example", "sample" ], | ||||
| "content": "This will be unchanged" | ||||
| } | ||||
| A user agent wishing to change the value of the "title" member from | ||||
| "Goodbye!" to the value "Hello!", add a new "phoneNumber" member, | "Goodbye!" to the value "Hello!", add a new "phoneNumber" member, | |||
| remove the "familyName" member from the "author" object, and replace | remove the "familyName" member from the "author" object, and replace | |||
| the "tags" Array so that it doesn't include the word "sample", would | the "tags" array so that it doesn't include the word "sample" would | |||
| send the following request: | send the following request: | |||
| PATCH /my/resource HTTP/1.1 | PATCH /my/resource HTTP/1.1 | |||
| Host: example.org | Host: example.org | |||
| Content-Type: application/merge-patch+json | Content-Type: application/merge-patch+json | |||
| { | { | |||
| "title": "Hello!", | "title": "Hello!", | |||
| "phoneNumber": "+01-123-456-7890", | "phoneNumber": "+01-123-456-7890", | |||
| "author": { | "author": { | |||
| "familyName": null | "familyName": null | |||
| }, | }, | |||
| "tags": [ "example" ] | "tags": [ "example" ] | |||
| } | } | |||
| The resulting JSON document would be: | The resulting JSON document would be: | |||
| { | { | |||
| "title": "Hello!", | "title": "Hello!", | |||
| "author" : { | "author" : { | |||
| "givenName" : "John" | "givenName" : "John" | |||
| }, | }, | |||
| "tags": [ "example" ], | "tags": [ "example" ], | |||
| "content": "This will be unchanged", | "content": "This will be unchanged", | |||
| "phoneNumber": "+01-123-456-7890" | "phoneNumber": "+01-123-456-7890" | |||
| } | } | |||
| 4. IANA Considerations | 4. IANA Considerations | |||
| This specification registers the following additional MIME Media | This specification registers the following additional MIME media | |||
| Types: | types: | |||
| Type name: application | Type name: application | |||
| Subtype name: merge-patch+json | Subtype name: merge-patch+json | |||
| Required parameters: None | Required parameters: None | |||
| Optional parameters: None | Optional parameters: None | |||
| Encoding considerations: Resources that use the "application/ | Encoding considerations: Resources that use the "application/ | |||
| merge-patch+json" media type are required to conform to the | merge-patch+json" media type are required to conform to the | |||
| "application/json" Media Type and are therefore subject to the | "application/json" media type and are therefore subject to the | |||
| same encoding considerations specified in Section 8 of [RFC7159]. | same encoding considerations specified in Section 8 of [RFC7159]. | |||
| Security considerations: As defined in this specification | Security considerations: As defined in this specification | |||
| Published specification: This specification. | Published specification: This specification. | |||
| Applications that use this media type: None currently known. | Applications that use this media type: None currently known. | |||
| Additional information: | Additional information: | |||
| Magic number(s): N/A | Magic number(s): N/A | |||
| File extension(s): N/A | File extension(s): N/A | |||
| Macintosh file type code(s): TEXT | Macintosh file type code(s): TEXT | |||
| Person & email address to contact for further information: IESG | Person & email address to contact for further information: IESG | |||
| Intended usage: COMMON | Intended usage: COMMON | |||
| Restrictions on usage: None. | Restrictions on usage: None | |||
| Author: James M Snell <jasnell@gmail.com> | Author: James M. Snell <jasnell@gmail.com> | |||
| Change controller: IESG | Change controller: IESG | |||
| 5. Security Considerations | 5. Security Considerations | |||
| The "application/merge-patch+json" Media Type allows user agents to | The "application/merge-patch+json" media type allows user agents to | |||
| indicate their intention that the server determine the specific set | indicate their intention for the server to determine the specific set | |||
| of change operations to be applied to a target resource. As such, it | of change operations to be applied to a target resource. As such, it | |||
| is the server's responsibility to determine the appropriateness of | is the server's responsibility to determine the appropriateness of | |||
| any given change as well as the user agent's authorization to request | any given change as well as the user agent's authorization to request | |||
| such changes. How such determinations are made is considered out of | such changes. How such determinations are made is considered out of | |||
| the scope of this specification. | the scope of this specification. | |||
| All of the the security considerations discussed in Section 5 of | All of the security considerations discussed in Section 5 of | |||
| [RFC5789] apply to all uses of the HTTP PATCH method with the | [RFC5789] apply to all uses of the HTTP PATCH method with the | |||
| "application/merge-patch+json" Media Type. | "application/merge-patch+json" media type. | |||
| 6. Acknowledgements | ||||
| 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. | ||||
| 7. References | 6. References | |||
| 7.1. Normative References | 6.1. Normative References | |||
| [RFC7159] Bray, T., "The JavaScript Object Notation (JSON) Data | [RFC7159] Bray, T., "The JavaScript Object Notation (JSON) Data | |||
| Interchange Format", RFC 7159, March 2014. | Interchange Format", RFC 7159, March 2014, | |||
| <http://www.rfc-editor.org/info/rfc7159>. | ||||
| 7.2. Informative References | 6.2. Informative References | |||
| [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", RFC | [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", RFC | |||
| 5789, March 2010. | 5789, March 2010, | |||
| <http://www.rfc-editor.org/info/rfc5789>. | ||||
| Appendix A. Example Test Cases | Appendix A. Example Test Cases | |||
| ORIGINAL PATCH RESULT | ORIGINAL PATCH RESULT | |||
| ------------------------------------------ | ------------------------------------------ | |||
| {"a":"b"} {"a":"c"} {"a":"c"} | {"a":"b"} {"a":"c"} {"a":"c"} | |||
| {"a":"b"} {"b":"c"} {"a":"b", | {"a":"b"} {"b":"c"} {"a":"b", | |||
| "b":"c"} | "b":"c"} | |||
| {"a":"b"} {"a":null} {} | {"a":"b"} {"a":null} {} | |||
| {"a":"b", {"a":null} {"b":"c"} | {"a":"b", {"a":null} {"b":"c"} | |||
| skipping to change at page 9, line 5 | skipping to change at page 9, line 5 | |||
| "a":1} | "a":1} | |||
| [1,2] {"a":"b", {"a":"b"} | [1,2] {"a":"b", {"a":"b"} | |||
| "c":null} | "c":null} | |||
| {} {"a": {"a": | {} {"a": {"a": | |||
| {"bb": {"bb": | {"bb": {"bb": | |||
| {"ccc": {}}} | {"ccc": {}}} | |||
| null}}} | null}}} | |||
| Acknowledgments | ||||
| Many people contributed significant ideas to this document. These | ||||
| people include, but are not limited to, James Manger, Matt Miller, | ||||
| Carsten Bormann, Bjoern Hoehrmann, Pete Resnick, and Richard Barnes. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Paul Hoffman | Paul Hoffman | |||
| VPN Consortium | VPN Consortium | |||
| Email: paul.hoffman@vpnc.org | EMail: paul.hoffman@vpnc.org | |||
| James M Snell | James M. Snell | |||
| Email: jasnell@gmail.com | EMail: jasnell@gmail.com | |||
| End of changes. 38 change blocks. | ||||
| 100 lines changed or deleted | 97 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||