| < draft-ietf-appsawg-json-patch-08.txt | draft-ietf-appsawg-json-patch-09.txt > | |||
|---|---|---|---|---|
| Applications Area Working Group P. Bryan, Ed. | Applications Area Working Group P. Bryan, Ed. | |||
| Internet-Draft Salesforce.com | Internet-Draft Salesforce.com | |||
| Intended status: Informational M. Nottingham, Ed. | Intended status: Standards Track M. Nottingham, Ed. | |||
| Expires: June 14, 2013 Akamai | Expires: July 8, 2013 Akamai | |||
| December 11, 2012 | January 4, 2013 | |||
| JSON Patch | JSON Patch | |||
| draft-ietf-appsawg-json-patch-08 | draft-ietf-appsawg-json-patch-09 | |||
| Abstract | Abstract | |||
| JSON Patch defines the media type "application/json-patch", a JSON | JSON Patch defines the media type "application/json-patch", a JSON | |||
| document structure for expressing a sequence of operations to apply | document structure for expressing a sequence of operations to apply | |||
| to a JSON document, suitable for use with the HTTP PATCH method. | to a JavaScript Object Notation (JSON) document, suitable for use | |||
| with the HTTP PATCH method. | ||||
| Status of this Memo | Status of this Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on June 14, 2013. | This Internet-Draft will expire on July 8, 2013. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2012 IETF Trust and the persons identified as the | Copyright (c) 2013 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 | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| 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 . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 3. Document Structure . . . . . . . . . . . . . . . . . . . . . . 3 | 3. Document Structure . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 4. Operations . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 4. Operations . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 4.1. add . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 4.1. add . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 4.2. remove . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 4.2. remove . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 4.3. replace . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 4.3. replace . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.4. move . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 4.4. move . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.5. copy . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 4.5. copy . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.6. test . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 4.6. test . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 5. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 7 | 5. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | |||
| 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 9 | 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . . 10 | 9.1. Normative References . . . . . . . . . . . . . . . . . . . 10 | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . . 10 | 9.2. Informative References . . . . . . . . . . . . . . . . . . 10 | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 10 | Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| A.1. Adding an Object Member . . . . . . . . . . . . . . . . . 10 | A.1. Adding an Object Member . . . . . . . . . . . . . . . . . 10 | |||
| A.2. Adding an Array Element . . . . . . . . . . . . . . . . . 11 | A.2. Adding an Array Element . . . . . . . . . . . . . . . . . 11 | |||
| A.3. Removing an Object Member . . . . . . . . . . . . . . . . 11 | A.3. Removing an Object Member . . . . . . . . . . . . . . . . 11 | |||
| A.4. Removing an Array Element . . . . . . . . . . . . . . . . 12 | A.4. Removing an Array Element . . . . . . . . . . . . . . . . 12 | |||
| A.5. Replacing a Value . . . . . . . . . . . . . . . . . . . . 12 | A.5. Replacing a Value . . . . . . . . . . . . . . . . . . . . 12 | |||
| A.6. Moving a Value . . . . . . . . . . . . . . . . . . . . . . 12 | A.6. Moving a Value . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| A.7. Moving an Array Element . . . . . . . . . . . . . . . . . 13 | A.7. Moving an Array Element . . . . . . . . . . . . . . . . . 13 | |||
| A.8. Testing a Value: Success . . . . . . . . . . . . . . . . . 14 | A.8. Testing a Value: Success . . . . . . . . . . . . . . . . . 14 | |||
| A.9. Testing a Value: Error . . . . . . . . . . . . . . . . . . 14 | A.9. Testing a Value: Error . . . . . . . . . . . . . . . . . . 14 | |||
| A.10. Adding a nested Member Object . . . . . . . . . . . . . . 14 | A.10. Adding a nested Member Object . . . . . . . . . . . . . . 14 | |||
| A.11. Ignoring Unrecognized Elements . . . . . . . . . . . . . . 15 | A.11. Ignoring Unrecognized Elements . . . . . . . . . . . . . . 15 | |||
| A.12. Adding to a Non-existant Target . . . . . . . . . . . . . 15 | A.12. Adding to a Non-existant Target . . . . . . . . . . . . . 15 | |||
| A.13. Invalid JSON Patch Document . . . . . . . . . . . . . . . 16 | A.13. Invalid JSON Patch Document . . . . . . . . . . . . . . . 15 | |||
| A.14. ~ Escape Ordering . . . . . . . . . . . . . . . . . . . . 16 | A.14. ~ Escape Ordering . . . . . . . . . . . . . . . . . . . . 16 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 16 | A.15. Comparing Strings and Numbers . . . . . . . . . . . . . . 16 | |||
| A.16. Adding an Array Value . . . . . . . . . . . . . . . . . . 17 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 17 | ||||
| 1. Introduction | 1. Introduction | |||
| JavaScript Object Notation (JSON) [RFC4627] is a common format for | JavaScript Object Notation (JSON) [RFC4627] is a common format for | |||
| the exchange and storage of structured data. HTTP PATCH [RFC5789] | the exchange and storage of structured data. HTTP PATCH [RFC5789] | |||
| extends the Hypertext Transfer Protocol (HTTP) [RFC2616] with a | extends the Hypertext Transfer Protocol (HTTP) [RFC2616] with a | |||
| method to perform partial modifications to resources. | method to perform partial modifications to resources. | |||
| JSON Patch is a format (identified by the media type "application/ | JSON Patch is a format (identified by the media type "application/ | |||
| json-patch") for expressing a sequence of operations to apply to a | json-patch") for expressing a sequence of operations to apply to a | |||
| target JSON document, suitable for use with the HTTP PATCH method. | target JSON document, suitable for use with the HTTP PATCH method. | |||
| This format is also potentially useful in other cases when it's | This format is also potentially useful in other cases where necessary | |||
| necessary to make partial updates to a JSON document. | to make partial updates to a JSON document. | |||
| 2. Conventions | 2. Conventions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
| See Section 5 for information about handling errors. | See Section 5 for information about handling errors. | |||
| 3. Document Structure | 3. Document Structure | |||
| skipping to change at page 3, line 44 ¶ | skipping to change at page 3, line 44 ¶ | |||
| [ | [ | |||
| { "op": "test", "path": "/a/b/c", "value": "foo" }, | { "op": "test", "path": "/a/b/c", "value": "foo" }, | |||
| { "op": "remove", "path": "/a/b/c" }, | { "op": "remove", "path": "/a/b/c" }, | |||
| { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] }, | { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] }, | |||
| { "op": "replace", "path": "/a/b/c", "value": 42 }, | { "op": "replace", "path": "/a/b/c", "value": 42 }, | |||
| { "op": "move", "from": "/a/b/c", "path": "/a/b/d" }, | { "op": "move", "from": "/a/b/c", "path": "/a/b/d" }, | |||
| { "op": "copy", "from": "/a/b/d", "path": "/a/b/e" } | { "op": "copy", "from": "/a/b/d", "path": "/a/b/e" } | |||
| ] | ] | |||
| Evaluation of a JSON Patch document begins with a target JSON | Evaluation of a JSON Patch document begins against a target JSON | |||
| document. Operations are applied sequentially in the order they | document. Operations are applied sequentially in the order they | |||
| appear in the array. Each operation in the sequence is applied to | appear in the array. Each operation in the sequence is applied to | |||
| the target document; the resulting document becomes the target of the | the target document; the resulting document becomes the target of the | |||
| next operation. Evaluation continues until all operations are | next operation. Evaluation continues until all operations are | |||
| successfully applied, or an error condition is encountered. | successfully applied, or an error condition is encountered. | |||
| 4. Operations | 4. Operations | |||
| Operation objects MUST have exactly one "op" member, whose value | Operation objects MUST have exactly one "op" member, whose value | |||
| indicates the operation to perform. Its value MUST be one of "add", | indicates the operation to perform. Its value MUST be one of "add", | |||
| skipping to change at page 4, line 29 ¶ | skipping to change at page 4, line 29 ¶ | |||
| explicitly defined for the operation in question MUST be ignored. | explicitly defined for the operation in question MUST be ignored. | |||
| Note that the ordering of members in JSON objects is not significant; | Note that the ordering of members in JSON objects is not significant; | |||
| therefore, the following operation objects are equivalent: | therefore, the following operation objects are equivalent: | |||
| { "op": "add", "path": "/a/b/c", "value": "foo" } | { "op": "add", "path": "/a/b/c", "value": "foo" } | |||
| { "path": "/a/b/c", "op": "add", "value": "foo" } | { "path": "/a/b/c", "op": "add", "value": "foo" } | |||
| { "value": "foo", "path": "/a/b/c", "op": "add" } | { "value": "foo", "path": "/a/b/c", "op": "add" } | |||
| Operations are applied to the data structures represented by a JSON | Operations are applied to the data structures represented by a JSON | |||
| document; i.e., after unescaping takes place. | document; i.e., after any unescaping (see [RFC4627], Section 2.5) | |||
| takes place. | ||||
| 4.1. add | 4.1. add | |||
| The "add" operation adds a new value at the target location. The | The "add" operation performs the following function, depending upon | |||
| operation object MUST contain a "value" member that specifies the | what the target location references: | |||
| value to be added. | ||||
| o If the target location specifies an array index, a new value is | ||||
| inserted into the array at the specified index. | ||||
| o If the target location specifies an object member that does not | ||||
| already exist, a new member is added to the object. | ||||
| o If the target location specifies an object member that does exist, | ||||
| that member's value is replaced. | ||||
| For example: | For example: | |||
| { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] } | { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] } | |||
| When the operation is applied, the target location MUST reference one | When the operation is applied, the target location MUST reference one | |||
| of: | of: | |||
| o The root of the target document - whereupon the specified value | o The root of the target document - whereupon the specified value | |||
| becomes the entire content of the target document. | becomes the entire content of the target document. | |||
| o A member to add to an existing object - whereupon the supplied | o A member to add to an existing object - whereupon the supplied | |||
| value is added to that object at the indicated location. If the | value is added to that object at the indicated location. If the | |||
| member already exists, it is replaced by the specified value. | member already exists, it is replaced by the specified value. | |||
| o An element to add to an existing array - whereupon the supplied | o An element to add to an existing array - whereupon the supplied | |||
| value is added to the array at the indicated location. Any | value is added to the array at the indicated location. Any | |||
| elements at or above the specified index are shifted one position | elements at or above the specified index are shifted one position | |||
| to the right. The specified index MUST NOT be greater than the | to the right. The specified index MUST NOT be greater than the | |||
| number of elements in the array. If the "-" character is used to | number of elements in the array. If the "-" character is used to | |||
| index the end of the array, this has the effect of appending the | index the end of the array (see [JSON-Pointer]), this has the | |||
| value to the array. | effect of appending the value to the array. | |||
| Because this operation is designed to add to existing objects and | Because this operation is designed to add to existing objects and | |||
| arrays, its target location will often not resolve to an existing | arrays, its target location will often not exist. Although the | |||
| value. Although the pointer's error handling algorithm will thus be | pointer's error handling algorithm will thus be invoked, this | |||
| invoked, this specification defines the error handling behaviour for | specification defines the error handling behaviour for "add" pointers | |||
| "add" pointers to ignore that error and add value as specified. | to ignore that error and add the value as specified. | |||
| The object itself or an array containing it, however, has to exist, | ||||
| and it remains an error for that not to be the case. | ||||
| For example, "add"ing to the path "/a/b" to this document: | However, the object itself or an array containing it does need to | |||
| exist, and it remains an error for that not to be the case. For | ||||
| example, "add"ing to the path "/a/b" to this document: | ||||
| { "a": { "foo": 1 } } | { "a": { "foo": 1 } } | |||
| is not an error, because "a" exists, and "b" will be added to its | is not an error, because "a" exists, and "b" will be added to its | |||
| value. It is an error in this document: | value. It is an error in this document: | |||
| { "q": { "bar": 2 } } | { "q": { "bar": 2 } } | |||
| because "a" does not exist. | because "a" does not exist. | |||
| skipping to change at page 6, line 32 ¶ | skipping to change at page 6, line 40 ¶ | |||
| The "from" location MUST exist for the operation to be successful. | The "from" location MUST exist for the operation to be successful. | |||
| For example: | For example: | |||
| { "op": "move", "from": "/a/b/c", "path": "/a/b/d" } | { "op": "move", "from": "/a/b/c", "path": "/a/b/d" } | |||
| This operation is functionally identical to a "remove" operation on | This operation is functionally identical to a "remove" operation on | |||
| the "from" location, followed immediately by an "add" operation at | the "from" location, followed immediately by an "add" operation at | |||
| the target location with the value that was just removed. | the target location with the value that was just removed. | |||
| The target location MUST NOT be part of the location defined by | The "from" location MUST NOT be a proper prefix of the "path" | |||
| "from"; i.e., a location cannot be moved into one of its children. | location; i.e., a location cannot be moved into one of its children. | |||
| 4.5. copy | 4.5. copy | |||
| The "copy" operation copies the value at a specified location to the | The "copy" operation copies the value at a specified location to the | |||
| target location. | target location. | |||
| The operation object MUST contain a "from" member, a string | The operation object MUST contain a "from" member, a string | |||
| containing a JSON Pointer value that references the location in the | containing a JSON Pointer value that references the location in the | |||
| target document to copy the value from. | target document to copy the value from. | |||
| skipping to change at page 7, line 16 ¶ | skipping to change at page 7, line 23 ¶ | |||
| The "test" operation tests that a value at the target location is | The "test" operation tests that a value at the target location is | |||
| equal to a specified value. | equal to a specified value. | |||
| The operation object MUST contain a "value" member that conveys the | The operation object MUST contain a "value" member that conveys the | |||
| value to be compared to that at the target location. | value to be compared to that at the target location. | |||
| The target location MUST be equal to the "value" value for the | The target location MUST be equal to the "value" value for the | |||
| operation to be considered successful. | operation to be considered successful. | |||
| Here, "equal" means that the value at the target location and the | Here, "equal" means that the value at the target location and that | |||
| value conveyed by "value" are of the same JSON type, and considered | conveyed by "value" are of the same JSON type, and considered equal | |||
| equal by the following rules for that type: | by the following rules for that type: | |||
| o strings: are considered equal if they contain the same number of | o strings: are considered equal if they contain the same number of | |||
| Unicode characters and their code points are position-wise equal. | Unicode characters and their code points are position-wise equal. | |||
| o numbers: are considered equal if their values are numerically | o numbers: are considered equal if their values are numerically | |||
| equal. | equal. | |||
| o arrays: are considered equal if they contain the same number of | o arrays: are considered equal if they contain the same number of | |||
| values, and each value can be considered equal to the value at the | values, and each value can be considered equal to the value at the | |||
| corresponding position in the other array. | corresponding position in the other array, using this list of | |||
| type-specific rules. | ||||
| o objects: are considered equal if they contain the same number of | o objects: are considered equal if they contain the same number of | |||
| members, and each member can be considered equal to a member in | members, and each member can be considered equal to a member in | |||
| the other object, by comparing their keys as strings, and values | the other object, by comparing their keys as strings, and values | |||
| using this list of type-specific rules. | using this list of type-specific rules. | |||
| o literals (false, true and null): are considered equal if they are | o literals (false, true and null): are considered equal if they are | |||
| the same. | the same. | |||
| Note that this is a logical comparison; e.g., whitespace between the | Note that this is a logical comparison; e.g., whitespace between the | |||
| skipping to change at page 9, line 43 ¶ | skipping to change at page 10, line 6 ¶ | |||
| However, such browsers are not widely used ( estimated to comprise | However, such browsers are not widely used ( estimated to comprise | |||
| less than 1% of the market, at the time of writing). Publishers who | less than 1% of the market, at the time of writing). Publishers who | |||
| are nevertheless concerned about this attack are advised to avoid | are nevertheless concerned about this attack are advised to avoid | |||
| making such documents available with HTTP GET. | making such documents available with HTTP GET. | |||
| 8. Acknowledgements | 8. Acknowledgements | |||
| The following individuals contributed ideas, feedback and wording to | The following individuals contributed ideas, feedback and wording to | |||
| this specification: | this specification: | |||
| Mike Acar, Mike Amundsen, Cyrus Daboo, Paul Davis, Murray S. | Mike Acar, Mike Amundsen, Cyrus Daboo, Paul Davis, Stefan Koegl, | |||
| Kucherawy, Dean Landolt, Randall Leeds, James Manger, Julian | Murray S. Kucherawy, Dean Landolt, Randall Leeds, James Manger, | |||
| Reschke, James Snell, Eli Stevens and Henry S. Thompson. | Julian Reschke, James Snell, Eli Stevens and Henry S. Thompson. | |||
| The structure of a JSON Patch document was influenced by the XML | The structure of a JSON Patch document was influenced by the XML | |||
| Patch document [RFC5261] specification. | Patch document [RFC5261] specification. | |||
| 9. References | 9. References | |||
| 9.1. Normative References | 9.1. Normative References | |||
| [JSON-Pointer] | [JSON-Pointer] | |||
| Bryan, P., Zyp, K., and M. Nottingham, "JSON Pointer", | Bryan, P., Zyp, K., and M. Nottingham, "JSON Pointer", | |||
| skipping to change at page 10, line 42 ¶ | skipping to change at page 11, line 5 ¶ | |||
| [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | |||
| RFC 5789, March 2010. | RFC 5789, March 2010. | |||
| Appendix A. Examples | Appendix A. Examples | |||
| A.1. Adding an Object Member | A.1. Adding an Object Member | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "foo": "bar"} | |||
| "foo": "bar" | ||||
| } | ||||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "add", "path": "/baz", "value": "qux" } | { "op": "add", "path": "/baz", "value": "qux" } | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { | |||
| "baz": "qux", | "baz": "qux", | |||
| "foo": "bar" | "foo": "bar" | |||
| } | } | |||
| A.2. Adding an Array Element | A.2. Adding an Array Element | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "foo": [ "bar", "baz" ] } | |||
| "foo": [ "bar", "baz" ] | ||||
| } | ||||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "add", "path": "/foo/1", "value": "qux" } | { "op": "add", "path": "/foo/1", "value": "qux" } | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { "foo": [ "bar", "qux", "baz" ] } | |||
| "foo": [ "bar", "qux", "baz" ] | ||||
| } | ||||
| A.3. Removing an Object Member | A.3. Removing an Object Member | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { | |||
| "baz": "qux", | "baz": "qux", | |||
| "foo": "bar" | "foo": "bar" | |||
| } | } | |||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "remove", "path": "/baz" } | { "op": "remove", "path": "/baz" } | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { "foo": "bar" } | |||
| "foo": "bar" | ||||
| } | ||||
| A.4. Removing an Array Element | A.4. Removing an Array Element | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "foo": [ "bar", "qux", "baz" ] } | |||
| "foo": [ "bar", "qux", "baz" ] | ||||
| } | ||||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "remove", "path": "/foo/1" } | { "op": "remove", "path": "/foo/1" } | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { "foo": [ "bar", "baz" ] } | |||
| "foo": [ "bar", "baz" ] | ||||
| } | ||||
| A.5. Replacing a Value | A.5. Replacing a Value | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { | |||
| "baz": "qux", | "baz": "qux", | |||
| "foo": "bar" | "foo": "bar" | |||
| } | } | |||
| skipping to change at page 13, line 37 ¶ | skipping to change at page 13, line 37 ¶ | |||
| "qux": { | "qux": { | |||
| "corge": "grault", | "corge": "grault", | |||
| "thud": "fred" | "thud": "fred" | |||
| } | } | |||
| } | } | |||
| A.7. Moving an Array Element | A.7. Moving an Array Element | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "foo": [ "all", "grass", "cows", "eat" ] } | |||
| "foo": [ "all", "grass", "cows", "eat" ] | ||||
| } | ||||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "move", "from": "/foo/1", "path": "/foo/3" } | { "op": "move", "from": "/foo/1", "path": "/foo/3" } | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { "foo": [ "all", "cows", "eat", "grass" ] } | |||
| "foo": [ "all", "cows", "eat", "grass" ] | ||||
| } | ||||
| A.8. Testing a Value: Success | A.8. Testing a Value: Success | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { | |||
| "baz": "qux", | "baz": "qux", | |||
| "foo": [ "a", 2, "c" ] | "foo": [ "a", 2, "c" ] | |||
| } | } | |||
| skipping to change at page 14, line 25 ¶ | skipping to change at page 14, line 25 ¶ | |||
| [ | [ | |||
| { "op": "test", "path": "/baz", "value": "qux" }, | { "op": "test", "path": "/baz", "value": "qux" }, | |||
| { "op": "test", "path": "/foo/1", "value": 2 } | { "op": "test", "path": "/foo/1", "value": 2 } | |||
| ] | ] | |||
| A.9. Testing a Value: Error | A.9. Testing a Value: Error | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "baz": "qux" } | |||
| "baz": "qux" | ||||
| } | ||||
| A JSON Patch document that will result in an error condition: | A JSON Patch document that will result in an error condition: | |||
| [ | [ | |||
| { "op": "test", "path": "/baz", "value": "bar" } | { "op": "test", "path": "/baz", "value": "bar" } | |||
| ] | ] | |||
| A.10. Adding a nested Member Object | A.10. Adding a nested Member Object | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "foo": "bar" } | |||
| "foo": "bar" | ||||
| } | ||||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "add", "path": "/child", "value": { "grandchild": { } } } | { "op": "add", "path": "/child", "value": { "grandchild": { } } } | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { | |||
| skipping to change at page 15, line 11 ¶ | skipping to change at page 15, line 4 ¶ | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { | |||
| "foo": "bar", | "foo": "bar", | |||
| "child": { | "child": { | |||
| "grandchild": { | "grandchild": { | |||
| } | } | |||
| } | } | |||
| } | } | |||
| A.11. Ignoring Unrecognized Elements | A.11. Ignoring Unrecognized Elements | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "foo": "bar" } | |||
| "foo":"bar" | ||||
| } | ||||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } | { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { | |||
| "foo":"bar", | "foo": "bar", | |||
| "baz":"qux" | "baz": "qux" | |||
| } | } | |||
| A.12. Adding to a Non-existant Target | A.12. Adding to a Non-existant Target | |||
| An example target JSON document: | An example target JSON document: | |||
| { | { "foo": "bar" } | |||
| "foo": "bar" | ||||
| } | ||||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| { "op": "add", "path": "/baz/bat", "value": "qux" } | { "op": "add", "path": "/baz/bat", "value": "qux" } | |||
| ] | ] | |||
| This JSON Patch document, applied to the target JSON document above, | This JSON Patch document, applied to the target JSON document above, | |||
| would result in an error (therefore not being applied) because the | would result in an error (therefore not being applied) because the | |||
| "add" operation's target location that references neither the root of | "add" operation's target location that references neither the root of | |||
| skipping to change at page 16, line 21 ¶ | skipping to change at page 16, line 11 ¶ | |||
| ] | ] | |||
| This JSON Patch document cannot be treated as an "add" operation | This JSON Patch document cannot be treated as an "add" operation | |||
| since there is a later "op":"remove" element. A JSON parser that | since there is a later "op":"remove" element. A JSON parser that | |||
| hides such duplicate element names therefore cannot be used unless it | hides such duplicate element names therefore cannot be used unless it | |||
| always exposes only the last element with a given name (eg | always exposes only the last element with a given name (eg | |||
| "op":"remove" in this example). | "op":"remove" in this example). | |||
| A.14. ~ Escape Ordering | A.14. ~ Escape Ordering | |||
| A JSON Patch document: | An example target JSON document: | |||
| { | { | |||
| "/": 9, | "/": 9, | |||
| "~1": 10 | "~1": 10 | |||
| } | } | |||
| A JSON Patch document: | A JSON Patch document: | |||
| [ | [ | |||
| {"op": "test", "path": "/~01", "value":"10"} | {"op": "test", "path": "/~01", "value": 10} | |||
| ] | ] | |||
| The resulting JSON document: | The resulting JSON document: | |||
| { | { | |||
| "/": 9, | "/": 9, | |||
| "~1": 10 | "~1": 10 | |||
| } | } | |||
| A.15. Comparing Strings and Numbers | ||||
| An example target JSON document: | ||||
| { | ||||
| "/": 9, | ||||
| "~1": 10 | ||||
| } | ||||
| A JSON Patch document: | ||||
| [ | ||||
| {"op": "test", "path": "/~01", "value": "10"} | ||||
| ] | ||||
| This results in an error, because the test fails; the document value | ||||
| is numeric, whereas the value tested for is a string. | ||||
| A.16. Adding an Array Value | ||||
| An example target JSON document: | ||||
| { "foo": ["bar"] } | ||||
| A JSON Patch document: | ||||
| [ | ||||
| { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } | ||||
| ] | ||||
| The resulting JSON document: | ||||
| { "foo": ["bar", ["abc", "def"]] } | ||||
| Authors' Addresses | Authors' Addresses | |||
| Paul C. Bryan (editor) | Paul C. Bryan (editor) | |||
| Salesforce.com | Salesforce.com | |||
| Phone: +1 604 783 1481 | Phone: +1 604 783 1481 | |||
| Email: pbryan@anode.ca | Email: pbryan@anode.ca | |||
| Mark Nottingham (editor) | Mark Nottingham (editor) | |||
| Akamai | Akamai | |||
| Email: mnot@mnot.net | Email: mnot@mnot.net | |||
| End of changes. 39 change blocks. | ||||
| 77 lines changed or deleted | 102 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||