| < draft-ietf-appsawg-json-pointer-02.txt | draft-ietf-appsawg-json-pointer-03.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: January 5, 2013 SitePen (USA) | Expires: February 12, 2013 SitePen (USA) | |||
| M. Nottingham, Ed. | M. Nottingham, Ed. | |||
| Rackspace | Rackspace | |||
| July 4, 2012 | August 11, 2012 | |||
| JSON Pointer | JSON Pointer | |||
| draft-ietf-appsawg-json-pointer-02 | draft-ietf-appsawg-json-pointer-03 | |||
| 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 34 ¶ | 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 January 5, 2013. | This Internet-Draft will expire on February 12, 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 13 ¶ | skipping to change at page 2, line 13 ¶ | |||
| 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 . . . . . . . . . . . . 5 | 6. URI Fragment Identifier Representation . . . . . . . . . . . . 5 | |||
| 7. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 5 | 7. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 6 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 9. Security Considerations . . . . . . . . . . . . . . . . . . . . 6 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . . 6 | |||
| 10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 6 | 10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 11. Normative References . . . . . . . . . . . . . . . . . . . . . 6 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 11.1. Normative References . . . . . . . . . . . . . . . . . . . 7 | ||||
| 11.2. Informative References . . . . . . . . . . . . . . . . . . 7 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 7 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 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] document. It is intended to be easily expressed in | (JSON) [RFC4627] document. It is intended to be easily expressed in | |||
| JSON string values and Uniform Resource Identifier (URI) [RFC3986] | JSON string values as well as Uniform Resource Identifier (URI) | |||
| fragment identifiers. | [RFC3986] 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 '~' (%x7E) or '/' (%x2F) characters, | If a reference token contains '~' (%x7E) or '/' (%x2F) characters, | |||
| they MUST be encoded as '~0' and '~1' respectively. | they MUST be encoded as '~0' and '~1' respectively. | |||
| ABNF syntax: | Its ABNF syntax is: | |||
| json-pointer = *( "/" reference-token ) | json-pointer = *( "/" reference-token ) | |||
| reference-token = *( unescaped / escaped ) | reference-token = *( unescaped / escaped ) | |||
| unescaped = %x00-2E / %x30-7D / %x7F-10FFFF | unescaped = %x00-2E / %x30-7D / %x7F-10FFFF | |||
| escaped = "~" ( "0" / "1" ) | 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 (see Section 7). | 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 document and completes with a reference to some value | |||
| value within the document. Each reference token in the JSON Pointer | within the document. Each reference token in the JSON Pointer is | |||
| is sequentially evaluated. | sequentially evaluated. | |||
| Evaluation of each reference token begins by decoding any escaped | Evaluation of each reference token begins by decoding any escaped | |||
| character sequence; this is performed by first transforming any | character sequence; this is performed by first transforming any | |||
| occurrence of the sequence '~1' to '/', then transforming any | occurrence of the sequence '~1' to '/', then transforming any | |||
| occurrence of the sequence '~0' to '~'. | occurrence of the sequence '~0' to '~'. | |||
| The reference token then modifies which value is referenced according | The reference token then modifies which value is referenced according | |||
| to the following scheme: | 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 (after | referenced value is the object member with the name (after | |||
| unescaping any backslash escape sequences that can occur in a JSON | unescaping any backslash escape sequences that can occur in a JSON | |||
| string) identified by the reference token. The member name is | string) identified by the reference token. The member name is | |||
| equal to the token if it has the same number of Unicode characters | equal to the token if it has the same number of Unicode characters | |||
| as token and their code points are position-wise equal. If a | as token and their code points are position-wise equal. If a | |||
| referenced member name is not unique in an object, the member that | referenced member name is not unique in an object, the member that | |||
| is referenced is undefined. | is referenced is undefined, and evaluation fails (see below). | |||
| 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 (possibly with leading zeros), and the new | integer value (possibly with leading zeros), and the new | |||
| referenced value is the array element with the zero-based index | referenced value is the array element with the zero-based index | |||
| identified by the token. | 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, | |||
| implementation MAY evaluate each token against a concrete value, and | implementations will evaluate each token against the document's | |||
| terminate evaluation with an error condition if a evaluation fails to | contents, and terminate evaluation with an error condition if it | |||
| resolve a concrete value (see Section 7). | fails to resolve a concrete value for any of the JSON pointer's | |||
| reference tokens. See Section 7 for details. | ||||
| 5. JSON String Representation | 5. JSON String Representation | |||
| A JSON Pointer can 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 | For example, given the JSON document | |||
| { | { | |||
| "foo": ["bar", "baz"], | "foo": ["bar", "baz"], | |||
| "": 0 | "": 0, | |||
| "a/b": 1, | "a/b": 1, | |||
| "c%d": 2, | "c%d": 2, | |||
| "e^f": 3, | "e^f": 3, | |||
| "g|h": 4, | "g|h": 4, | |||
| "i\\j": 5, | "i\\j": 5, | |||
| "k\"l": 6, | "k\"l": 6, | |||
| " ": 7, | " ": 7, | |||
| "m~n": 8 | "m~n": 8 | |||
| } | } | |||
| Then the following JSON strings evaluate to the accompanying values: | Then the following JSON strings evaluate to the accompanying values: | |||
| "" // the whole document | "" // the whole document | |||
| "/foo" ["bar", "baz"] | "/foo" ["bar", "baz"] | |||
| "/foo/0" "bar" | "/foo/0" "bar" | |||
| "/" 0 | "/" 0 | |||
| "/a~1b" 1 | "/a~1b" 1 | |||
| "/c%d" 2 | "/c%d" 2 | |||
| "/e^f" 3 | "/e^f" 3 | |||
| "/g|h" 4 | "/g|h" 4 | |||
| "/i\\j" 5 | "/i\\j" 5 | |||
| "/k\"l" 6 | "/k\"l" 6 | |||
| " " 7 | "/ " 7 | |||
| "m~0n" 8 | "/m~0n" 8 | |||
| 6. URI Fragment Identifier Representation | 6. URI Fragment Identifier Representation | |||
| A JSON Pointer can be represented in a URI fragment identifier. by | A JSON Pointer can be represented in a URI fragment identifier. by | |||
| encoding it into octets, using UTF-8 [RFC3629], percent-encoding | encoding it into octets, using UTF-8 [RFC3629], percent-encoding | |||
| those characters not allowed by the fragment rule in [RFC3986]. | those characters not allowed by the fragment rule in [RFC3986]. | |||
| Note that a given media type needs to nominate JSON Pointer as its | ||||
| fragment identifier syntax explicitly (usually, in its registration | ||||
| [RFC4288]); i.e., just because a document is JSON does not imply that | ||||
| JSON Pointer can be used as its fragment identifier syntax. | ||||
| Given the same example document as above, the following URI fragment | Given the same example document as above, the following URI fragment | |||
| identifiers evaluate to the accompanying values: | identifiers evaluate to the accompanying values: | |||
| # // the whole document | # // the whole document | |||
| #/foo ["bar", "baz"] | #/foo ["bar", "baz"] | |||
| #/foo/0 "bar" | #/foo/0 "bar" | |||
| #/ 0 | #/ 0 | |||
| #/a~1b 1 | #/a~1b 1 | |||
| #/c%25d 2 | #/c%25d 2 | |||
| #/e%5Ef 3 | #/e%5Ef 3 | |||
| skipping to change at page 6, line 19 ¶ | skipping to change at page 6, line 26 ¶ | |||
| This specification does not define how errors are handled; an | This specification does not define how errors are handled; an | |||
| application of JSON Pointer SHOULD specify the impact and handling of | application of JSON Pointer SHOULD specify the impact and handling of | |||
| each type of error. | each type of error. | |||
| For example, some applications might stop pointer processing upon an | For example, some applications might stop pointer processing upon an | |||
| error; others may attempt to recover from missing values by inserting | error; others may attempt to recover from missing values by inserting | |||
| default ones. | default ones. | |||
| 8. IANA Considerations | 8. IANA Considerations | |||
| TBD | This document has no impact upon IANA. | |||
| 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) | Note that JSON pointers can contain the NUL (Unicode U+0000) | |||
| character, which may not be representable in all programming | character, which may not be representable in all programming | |||
| languages. | languages. | |||
| 10. Acknowledgements | 10. 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, Carsten Bormann, Tim Bray, Jacob Davies, Martin J. | Mike Acar, Carsten Bormann, Tim Bray, Jacob Davies, Martin J. | |||
| Duerst, Bjoern Hoehrmann, James H. Manger, Drew Perttula, Julian | Duerst, Bjoern Hoehrmann, James H. Manger, Drew Perttula, Julian | |||
| Reschke. | Reschke. | |||
| 11. Normative References | 11. References | |||
| 11.1. 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 | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| RFC 3986, January 2005. | RFC 3986, January 2005. | |||
| skipping to change at page 7, line 17 ¶ | skipping to change at page 7, line 26 ¶ | |||
| [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/>. | |||
| 11.2. Informative References | ||||
| [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and | ||||
| Registration Procedures", BCP 13, RFC 4288, December 2005. | ||||
| 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) | |||
| End of changes. 19 change blocks. | ||||
| 22 lines changed or deleted | 38 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/ | ||||