| < draft-ietf-appsawg-json-pointer-01.txt | draft-ietf-appsawg-json-pointer-02.txt > | |||
|---|---|---|---|---|
| Applications Area Working Group P. Bryan, Ed. | Applications Area Working Group P. Bryan, Ed. | |||
| Internet-Draft ForgeRock | Internet-Draft ForgeRock | |||
| Intended status: Informational K. Zyp | Intended status: Informational K. Zyp | |||
| Expires: September 10, 2012 SitePen (USA) | Expires: January 5, 2013 SitePen (USA) | |||
| March 9, 2012 | M. Nottingham, Ed. | |||
| Rackspace | ||||
| July 4, 2012 | ||||
| JSON Pointer | JSON Pointer | |||
| draft-ietf-appsawg-json-pointer-01 | draft-ietf-appsawg-json-pointer-02 | |||
| Abstract | Abstract | |||
| JSON Pointer defines a string syntax for identifying a specific value | JSON Pointer defines a string syntax for identifying a specific value | |||
| within a JSON document. | within a JSON document. | |||
| 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. | |||
| skipping to change at page 1, line 32 ¶ | skipping to change at page 1, line 34 ¶ | |||
| 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 September 10, 2012. | This Internet-Draft will expire on January 5, 2013. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2012 IETF Trust and the persons identified as the | Copyright (c) 2012 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 . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 3. Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 3. Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 4. Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 4. Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 5. JSON String Representation . . . . . . . . . . . . . . . . . . 4 | 5. JSON String Representation . . . . . . . . . . . . . . . . . . 4 | |||
| 6. URI Fragment Identifier Representation . . . . . . . . . . . . 4 | 6. URI Fragment Identifier Representation . . . . . . . . . . . . 5 | |||
| 7. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 4 | 7. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 4 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 9. Security Considerations . . . . . . . . . . . . . . . . . . . . 5 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . . 6 | |||
| 10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 5 | 10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 11. Normative References . . . . . . . . . . . . . . . . . . . . . 5 | 11. Normative References . . . . . . . . . . . . . . . . . . . . . 6 | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . . 5 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 6 | ||||
| 1. Introduction | 1. Introduction | |||
| This specification defines JSON Pointer, a string syntax for | This specification defines JSON Pointer, a string syntax for | |||
| identifying a specific value within a JavaScript Object Notation | identifying a specific value within a JavaScript Object Notation | |||
| (JSON) [RFC4627] text document. This syntax is intended to be easily | (JSON) [RFC4627] document. It is intended to be easily expressed in | |||
| expressed in JSON string values and Uniform Resource Identifier (URI) | JSON string values and Uniform Resource Identifier (URI) [RFC3986] | |||
| [RFC3986] fragment identifiers. | fragment identifiers. | |||
| 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 [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
| This specification expresses normative syntax rules using Augmented | This specification expresses normative syntax rules using Augmented | |||
| Backus-Naur Form [RFC5234] (ABNF) notation. | Backus-Naur Form [RFC5234] (ABNF) notation. | |||
| 3. Syntax | 3. Syntax | |||
| A JSON Pointer is a [Unicode] string containing a sequence of zero or | A JSON Pointer is a [Unicode] string containing a sequence of zero or | |||
| more reference tokens, each prefixed by a '/' (%x2F) character. | more reference tokens, each prefixed by a '/' (%x2F) character. | |||
| If a reference token contains '/' (%x2F) or '^' (%x5E) characters, | If a reference token contains '~' (%x7E) or '/' (%x2F) characters, | |||
| such characters MUST each be prefixed (escaped) with a '^' (%x5E) | they MUST be encoded as '~0' and '~1' respectively. | |||
| character. | ||||
| ABNF syntax: | ABNF syntax: | |||
| json-pointer = *( "/" reference-token ) | json-pointer = *( "/" reference-token ) | |||
| reference-token = *( unescaped / escaped ) | reference-token = *( unescaped / escaped ) | |||
| unescaped = %x00-2E / %x30-5B / %x5D-10FFFF | unescaped = %x00-2E / %x30-7D / %x7F-10FFFF | |||
| escaped = "^" ( "/" / "^" ) | escaped = "~" ( "0" / "1" ) | |||
| It is an error condition if a JSON Pointer value does not conform to | It is an error condition if a JSON Pointer value does not conform to | |||
| this syntax. | this syntax (see Section 7). | |||
| 4. Evaluation | 4. Evaluation | |||
| Evaluation of a JSON Pointer begins with a reference to the root | Evaluation of a JSON Pointer begins with a reference to the root | |||
| value of a JSON text document and completes with a reference to some | value of a JSON text document and completes with a reference to some | |||
| value within the document. Each reference token in the JSON Pointer | value within the document. Each reference token in the JSON Pointer | |||
| is sequentially evaluated. | is sequentially evaluated. | |||
| Evaluation of each reference token begins by unescaping any escaped | Evaluation of each reference token begins by decoding any escaped | |||
| character sequence; this is performed by removing the '^' (escape) | character sequence; this is performed by first transforming any | |||
| prefix. The reference token then modifies which value is referenced | occurrence of the sequence '~1' to '/', then transforming any | |||
| according to the following scheme: | occurrence of the sequence '~0' to '~'. | |||
| The reference token then modifies which value is referenced according | ||||
| to the following scheme: | ||||
| If the currently referenced value is a JSON object, the new | If the currently referenced value is a JSON object, the new | |||
| referenced value is the object member with the name identified by | referenced value is the object member with the name (after | |||
| the reference token. The member name is equal to the token if it | unescaping any backslash escape sequences that can occur in a JSON | |||
| has the same number of Unicode characters as token and their | string) identified by the reference token. The member name is | |||
| codepoints are positionwise equal. If a referenced member name is | equal to the token if it has the same number of Unicode characters | |||
| not unique in an object, the member that is referenced is | as token and their code points are position-wise equal. If a | |||
| undefined. | referenced member name is not unique in an object, the member that | |||
| is referenced is undefined. | ||||
| If the currently referenced value is a JSON array, the reference | If the currently referenced value is a JSON array, the reference | |||
| token MUST contain characters that represent an unsigned base-10 | token MUST contain characters that represent an unsigned base-10 | |||
| integer value, and the new referenced value is the array element | integer value (possibly with leading zeros), and the new | |||
| with the zero-based index identified by the token. | referenced value is the array element with the zero-based index | |||
| identified by the token. | ||||
| If a reference token is being evaluated against a JSON document, the | If a reference token is being evaluated against a JSON document, the | |||
| implementation MAY evaluate each token against a concrete value, and | implementation MAY evaluate each token against a concrete value, and | |||
| terminate evaluation with an error condition if a evaluation fails to | terminate evaluation with an error condition if a evaluation fails to | |||
| resolve a concrete value. | resolve a concrete value (see Section 7). | |||
| 5. JSON String Representation | 5. JSON String Representation | |||
| A JSON Pointer MAY be represented in a JSON string value. Per | A JSON Pointer can be represented in a JSON string value. Per | |||
| [RFC4627], section 2.5, all instances of quotation mark '"' (%x22), | [RFC4627], section 2.5, all instances of quotation mark '"' (%x22), | |||
| reverse solidus '\' (%x5C) and control (%x00-1F) characters MUST be | reverse solidus '\' (%x5C) and control (%x00-1F) characters MUST be | |||
| escaped. | escaped. | |||
| For example, given the JSON document | ||||
| { | ||||
| "foo": ["bar", "baz"], | ||||
| "": 0 | ||||
| "a/b": 1, | ||||
| "c%d": 2, | ||||
| "e^f": 3, | ||||
| "g|h": 4, | ||||
| "i\\j": 5, | ||||
| "k\"l": 6, | ||||
| " ": 7, | ||||
| "m~n": 8 | ||||
| } | ||||
| Then the following JSON strings evaluate to the accompanying values: | ||||
| "" // the whole document | ||||
| "/foo" ["bar", "baz"] | ||||
| "/foo/0" "bar" | ||||
| "/" 0 | ||||
| "/a~1b" 1 | ||||
| "/c%d" 2 | ||||
| "/e^f" 3 | ||||
| "/g|h" 4 | ||||
| "/i\\j" 5 | ||||
| "/k\"l" 6 | ||||
| " " 7 | ||||
| "m~0n" 8 | ||||
| 6. URI Fragment Identifier Representation | 6. URI Fragment Identifier Representation | |||
| A JSON Pointer MAY be represented in a URI fragment identifier. The | A JSON Pointer can be represented in a URI fragment identifier. by | |||
| JSON pointer MUST be UTF-8 [RFC3629] encoded as octets; octets not in | encoding it into octets, using UTF-8 [RFC3629], percent-encoding | |||
| the URI "unreserved" set SHOULD be percent-encoded, per [RFC3986], | those characters not allowed by the fragment rule in [RFC3986]. | |||
| section 2.5. | ||||
| Given the same example document as above, the following URI fragment | ||||
| identifiers evaluate to the accompanying values: | ||||
| # // the whole document | ||||
| #/foo ["bar", "baz"] | ||||
| #/foo/0 "bar" | ||||
| #/ 0 | ||||
| #/a~1b 1 | ||||
| #/c%25d 2 | ||||
| #/e%5Ef 3 | ||||
| #/g%7Ch 4 | ||||
| #/i%5Cj 5 | ||||
| #/k%22l 6 | ||||
| #/%20 7 | ||||
| #/m~0n 8 | ||||
| 7. Error Handling | 7. Error Handling | |||
| In the event of an error condition, evaluation of the JSON Pointer | In the event of an error condition, evaluation of the JSON Pointer | |||
| fails to complete. | fails to complete. | |||
| This includes, but is not limited to: | ||||
| o Invalid pointer syntax | ||||
| o A pointer that references a non-existent value | ||||
| This specification does not define how errors are handled; an | ||||
| application of JSON Pointer SHOULD specify the impact and handling of | ||||
| each type of error. | ||||
| For example, some applications might stop pointer processing upon an | ||||
| error; others may attempt to recover from missing values by inserting | ||||
| default ones. | ||||
| 8. IANA Considerations | 8. IANA Considerations | |||
| This document has no IANA actions. | TBD | |||
| 9. Security Considerations | 9. Security Considerations | |||
| A given JSON Pointer is not guaranteed to reference an actual JSON | A given JSON Pointer is not guaranteed to reference an actual JSON | |||
| value. Implementations should be aware of this and take appropriate | value. Implementations should be aware of this and take appropriate | |||
| precautions. | precautions. | |||
| Note that JSON pointers can contain the NUL (Unicode U+0000) | ||||
| character, which may not be representable in all programming | ||||
| languages. | ||||
| 10. Acknowledgements | 10. Acknowledgements | |||
| The following individuals contributed ideas, feedback and wording, | The following individuals contributed ideas, feedback and wording to | |||
| which contributed to the content of this specification: | this specification: | |||
| Mike Acar, Carsten Bormann, Tim Bray, Jacob Davies, Martin J. | Mike Acar, Carsten Bormann, Tim Bray, Jacob Davies, Martin J. | |||
| Duerst, Bjoern Hoehrmann, James H. Manger, Mark Nottingham, Drew | Duerst, Bjoern Hoehrmann, James H. Manger, Drew Perttula, Julian | |||
| Perttula, Julian Reschke. | Reschke. | |||
| 11. Normative References | 11. Normative References | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | |||
| 10646", STD 63, RFC 3629, November 2003. | 10646", STD 63, RFC 3629, November 2003. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| skipping to change at page 5, line 42 ¶ | skipping to change at page 7, line 17 ¶ | |||
| [RFC4627] Crockford, D., "The application/json Media Type for | [RFC4627] Crockford, D., "The application/json Media Type for | |||
| JavaScript Object Notation (JSON)", RFC 4627, July 2006. | JavaScript Object Notation (JSON)", RFC 4627, July 2006. | |||
| [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, January 2008. | Specifications: ABNF", STD 68, RFC 5234, January 2008. | |||
| [Unicode] The Unicode Consortium, "The Unicode Standard, Version | [Unicode] The Unicode Consortium, "The Unicode Standard, Version | |||
| 6.0", October 2011, | 6.0", October 2011, | |||
| <http://www.unicode.org/versions/Unicode6.0.0/>. | <http://www.unicode.org/versions/Unicode6.0.0/>. | |||
| Appendix A. Examples | ||||
| The following examples illustrate the use of JSON Pointers in URI | ||||
| fragments for a JSON text document located at | ||||
| http://example.com/example.json, with the following value: | ||||
| { | ||||
| "foo": { | ||||
| "bar": [ "element0", "element1" ], | ||||
| "inner object": { | ||||
| "baz": "qux" | ||||
| } | ||||
| } | ||||
| http://example.com/example.json# | ||||
| Resolves to the object value at the root of the JSON text | ||||
| document. | ||||
| http://example.com/example.json#/foo | ||||
| Resolves to the object value of the "foo" member in the root | ||||
| object. | ||||
| http://example.com/example.json#/foo/inner%20object | ||||
| Resolves to the object value of the "inner object" member in the | ||||
| "foo" object value in the root object. | ||||
| http://example.com/example.json#/foo/inner%20object/baz | ||||
| Resolves to the string value "qux", which is the value of the | ||||
| "baz" member in the "inner object" member in the "foo" member in | ||||
| the root object. | ||||
| http://example.com/example.json#/foo/bar/0 | ||||
| Resolves to the string value "element0", which is the first value | ||||
| in the "bar" array in the "foo" member in the root object. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Paul C. Bryan (editor) | Paul C. Bryan (editor) | |||
| ForgeRock | ForgeRock | |||
| Phone: +1 604 783 1481 | Phone: +1 604 783 1481 | |||
| Email: pbryan@anode.ca | Email: pbryan@anode.ca | |||
| Kris Zyp | Kris Zyp | |||
| SitePen (USA) | SitePen (USA) | |||
| Phone: +1 650 968 8787 | Phone: +1 650 968 8787 | |||
| Email: kris@sitepen.com | Email: kris@sitepen.com | |||
| Mark Nottingham (editor) | ||||
| Rackspace | ||||
| Email: mnot@mnot.net | ||||
| End of changes. 23 change blocks. | ||||
| 78 lines changed or deleted | 112 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/ | ||||