123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 |
- Network Working Group D. Crockford
- Request for Comments: 4627 JSON.org
- Category: Informational July 2006
- The application/json Media Type for JavaScript Object Notation (JSON)
- Status of This Memo
- This memo provides information for the Internet community. It does
- not specify an Internet standard of any kind. Distribution of this
- memo is unlimited.
- Copyright Notice
- Copyright (C) The Internet Society (2006).
- Abstract
- JavaScript Object Notation (JSON) is a lightweight, text-based,
- language-independent data interchange format. It was derived from
- the ECMAScript Programming Language Standard. JSON defines a small
- set of formatting rules for the portable representation of structured
- data.
- 1. Introduction
- JavaScript Object Notation (JSON) is a text format for the
- serialization of structured data. It is derived from the object
- literals of JavaScript, as defined in the ECMAScript Programming
- Language Standard, Third Edition [ECMA].
- JSON can represent four primitive types (strings, numbers, booleans,
- and null) and two structured types (objects and arrays).
- A string is a sequence of zero or more Unicode characters [UNICODE].
- An object is an unordered collection of zero or more name/value
- pairs, where a name is a string and a value is a string, number,
- boolean, null, object, or array.
- An array is an ordered sequence of zero or more values.
- The terms "object" and "array" come from the conventions of
- JavaScript.
- JSON's design goals were for it to be minimal, portable, textual, and
- a subset of JavaScript.
- Crockford Informational [Page 1]
- RFC 4627 JSON July 2006
- 1.1. Conventions Used in This Document
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described in [RFC2119].
- The grammatical rules in this document are to be interpreted as
- described in [RFC4234].
- 2. JSON Grammar
- A JSON text is a sequence of tokens. The set of tokens includes six
- structural characters, strings, numbers, and three literal names.
- A JSON text is a serialized object or array.
- JSON-text = object / array
- These are the six structural characters:
- begin-array = ws %x5B ws ; [ left square bracket
- begin-object = ws %x7B ws ; { left curly bracket
- end-array = ws %x5D ws ; ] right square bracket
- end-object = ws %x7D ws ; } right curly bracket
- name-separator = ws %x3A ws ; : colon
- value-separator = ws %x2C ws ; , comma
- Insignificant whitespace is allowed before or after any of the six
- structural characters.
- ws = *(
- %x20 / ; Space
- %x09 / ; Horizontal tab
- %x0A / ; Line feed or New line
- %x0D ; Carriage return
- )
- 2.1. Values
- A JSON value MUST be an object, array, number, or string, or one of
- the following three literal names:
- false null true
- Crockford Informational [Page 2]
- RFC 4627 JSON July 2006
- The literal names MUST be lowercase. No other literal names are
- allowed.
- value = false / null / true / object / array / number / string
- false = %x66.61.6c.73.65 ; false
- null = %x6e.75.6c.6c ; null
- true = %x74.72.75.65 ; true
- 2.2. Objects
- An object structure is represented as a pair of curly brackets
- surrounding zero or more name/value pairs (or members). A name is a
- string. A single colon comes after each name, separating the name
- from the value. A single comma separates a value from a following
- name. The names within an object SHOULD be unique.
- object = begin-object [ member *( value-separator member ) ]
- end-object
- member = string name-separator value
- 2.3. Arrays
- An array structure is represented as square brackets surrounding zero
- or more values (or elements). Elements are separated by commas.
- array = begin-array [ value *( value-separator value ) ] end-array
- 2.4. Numbers
- The representation of numbers is similar to that used in most
- programming languages. A number contains an integer component that
- may be prefixed with an optional minus sign, which may be followed by
- a fraction part and/or an exponent part.
- Octal and hex forms are not allowed. Leading zeros are not allowed.
- A fraction part is a decimal point followed by one or more digits.
- An exponent part begins with the letter E in upper or lowercase,
- which may be followed by a plus or minus sign. The E and optional
- sign are followed by one or more digits.
- Numeric values that cannot be represented as sequences of digits
- (such as Infinity and NaN) are not permitted.
- Crockford Informational [Page 3]
- RFC 4627 JSON July 2006
- number = [ minus ] int [ frac ] [ exp ]
- decimal-point = %x2E ; .
- digit1-9 = %x31-39 ; 1-9
- e = %x65 / %x45 ; e E
- exp = e [ minus / plus ] 1*DIGIT
- frac = decimal-point 1*DIGIT
- int = zero / ( digit1-9 *DIGIT )
- minus = %x2D ; -
- plus = %x2B ; +
- zero = %x30 ; 0
- 2.5. Strings
- The representation of strings is similar to conventions used in the C
- family of programming languages. A string begins and ends with
- quotation marks. All Unicode characters may be placed within the
- quotation marks except for the characters that must be escaped:
- quotation mark, reverse solidus, and the control characters (U+0000
- through U+001F).
- Any character may be escaped. If the character is in the Basic
- Multilingual Plane (U+0000 through U+FFFF), then it may be
- represented as a six-character sequence: a reverse solidus, followed
- by the lowercase letter u, followed by four hexadecimal digits that
- encode the character's code point. The hexadecimal letters A though
- F can be upper or lowercase. So, for example, a string containing
- only a single reverse solidus character may be represented as
- "\u005C".
- Alternatively, there are two-character sequence escape
- representations of some popular characters. So, for example, a
- string containing only a single reverse solidus character may be
- represented more compactly as "\\".
- To escape an extended character that is not in the Basic Multilingual
- Plane, the character is represented as a twelve-character sequence,
- encoding the UTF-16 surrogate pair. So, for example, a string
- containing only the G clef character (U+1D11E) may be represented as
- "\uD834\uDD1E".
- Crockford Informational [Page 4]
- RFC 4627 JSON July 2006
- string = quotation-mark *char quotation-mark
- char = unescaped /
- escape (
- %x22 / ; " quotation mark U+0022
- %x5C / ; \ reverse solidus U+005C
- %x2F / ; / solidus U+002F
- %x62 / ; b backspace U+0008
- %x66 / ; f form feed U+000C
- %x6E / ; n line feed U+000A
- %x72 / ; r carriage return U+000D
- %x74 / ; t tab U+0009
- %x75 4HEXDIG ) ; uXXXX U+XXXX
- escape = %x5C ; \
- quotation-mark = %x22 ; "
- unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
- 3. Encoding
- JSON text SHALL be encoded in Unicode. The default encoding is
- UTF-8.
- Since the first two characters of a JSON text will always be ASCII
- characters [RFC0020], it is possible to determine whether an octet
- stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
- at the pattern of nulls in the first four octets.
- 00 00 00 xx UTF-32BE
- 00 xx 00 xx UTF-16BE
- xx 00 00 00 UTF-32LE
- xx 00 xx 00 UTF-16LE
- xx xx xx xx UTF-8
- 4. Parsers
- A JSON parser transforms a JSON text into another representation. A
- JSON parser MUST accept all texts that conform to the JSON grammar.
- A JSON parser MAY accept non-JSON forms or extensions.
- An implementation may set limits on the size of texts that it
- accepts. An implementation may set limits on the maximum depth of
- nesting. An implementation may set limits on the range of numbers.
- An implementation may set limits on the length and character contents
- of strings.
- Crockford Informational [Page 5]
- RFC 4627 JSON July 2006
- 5. Generators
- A JSON generator produces JSON text. The resulting text MUST
- strictly conform to the JSON grammar.
- 6. IANA Considerations
- The MIME media type for JSON text is application/json.
- Type name: application
- Subtype name: json
- Required parameters: n/a
- Optional parameters: n/a
- Encoding considerations: 8bit if UTF-8; binary if UTF-16 or UTF-32
- JSON may be represented using UTF-8, UTF-16, or UTF-32. When JSON
- is written in UTF-8, JSON is 8bit compatible. When JSON is
- written in UTF-16 or UTF-32, the binary content-transfer-encoding
- must be used.
- Security considerations:
- Generally there are security issues with scripting languages. JSON
- is a subset of JavaScript, but it is a safe subset that excludes
- assignment and invocation.
- A JSON text can be safely passed into JavaScript's eval() function
- (which compiles and executes a string) if all the characters not
- enclosed in strings are in the set of characters that form JSON
- tokens. This can be quickly determined in JavaScript with two
- regular expressions and calls to the test and replace methods.
- var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
- text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
- eval('(' + text + ')');
- Interoperability considerations: n/a
- Published specification: RFC 4627
- Crockford Informational [Page 6]
- RFC 4627 JSON July 2006
- Applications that use this media type:
- JSON has been used to exchange data between applications written
- in all of these programming languages: ActionScript, C, C#,
- ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua,
- Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme.
- Additional information:
- Magic number(s): n/a
- File extension(s): .json
- Macintosh file type code(s): TEXT
- Person & email address to contact for further information:
- Douglas Crockford
- douglas@crockford.com
- Intended usage: COMMON
- Restrictions on usage: none
- Author:
- Douglas Crockford
- douglas@crockford.com
- Change controller:
- Douglas Crockford
- douglas@crockford.com
- 7. Security Considerations
- See Security Considerations in Section 6.
- 8. Examples
- This is a JSON object:
- {
- "Image": {
- "Width": 800,
- "Height": 600,
- "Title": "View from 15th Floor",
- "Thumbnail": {
- "Url": "http://www.example.com/image/481989943",
- "Height": 125,
- "Width": "100"
- },
- "IDs": [116, 943, 234, 38793]
- Crockford Informational [Page 7]
- RFC 4627 JSON July 2006
- }
- }
- Its Image member is an object whose Thumbnail member is an object
- and whose IDs member is an array of numbers.
- This is a JSON array containing two objects:
- [
- {
- "precision": "zip",
- "Latitude": 37.7668,
- "Longitude": -122.3959,
- "Address": "",
- "City": "SAN FRANCISCO",
- "State": "CA",
- "Zip": "94107",
- "Country": "US"
- },
- {
- "precision": "zip",
- "Latitude": 37.371991,
- "Longitude": -122.026020,
- "Address": "",
- "City": "SUNNYVALE",
- "State": "CA",
- "Zip": "94085",
- "Country": "US"
- }
- ]
- 9. References
- 9.1. Normative References
- [ECMA] European Computer Manufacturers Association, "ECMAScript
- Language Specification 3rd Edition", December 1999,
- <http://www.ecma-international.org/publications/files/
- ecma-st/ECMA-262.pdf>.
- [RFC0020] Cerf, V., "ASCII format for network interchange", RFC 20,
- October 1969.
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
- [RFC4234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
- Specifications: ABNF", RFC 4234, October 2005.
- Crockford Informational [Page 8]
- RFC 4627 JSON July 2006
- [UNICODE] The Unicode Consortium, "The Unicode Standard Version 4.0",
- 2003, <http://www.unicode.org/versions/Unicode4.1.0/>.
- Author's Address
- Douglas Crockford
- JSON.org
- EMail: douglas@crockford.com
- Crockford Informational [Page 9]
- RFC 4627 JSON July 2006
- Full Copyright Statement
- Copyright (C) The Internet Society (2006).
- This document is subject to the rights, licenses and restrictions
- contained in BCP 78, and except as set forth therein, the authors
- retain all their rights.
- This document and the information contained herein are provided on an
- "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
- OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
- ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
- INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
- INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
- WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- Intellectual Property
- The IETF takes no position regarding the validity or scope of any
- Intellectual Property Rights or other rights that might be claimed to
- pertain to the implementation or use of the technology described in
- this document or the extent to which any license under such rights
- might or might not be available; nor does it represent that it has
- made any independent effort to identify any such rights. Information
- on the procedures with respect to rights in RFC documents can be
- found in BCP 78 and BCP 79.
- Copies of IPR disclosures made to the IETF Secretariat and any
- assurances of licenses to be made available, or the result of an
- attempt made to obtain a general license or permission for the use of
- such proprietary rights by implementers or users of this
- specification can be obtained from the IETF on-line IPR repository at
- http://www.ietf.org/ipr.
- The IETF invites any interested party to bring to its attention any
- copyrights, patents or patent applications, or other proprietary
- rights that may cover technology that may be required to implement
- this standard. Please address the information to the IETF at
- ietf-ipr@ietf.org.
- Acknowledgement
- Funding for the RFC Editor function is provided by the IETF
- Administrative Support Activity (IASA).
- Crockford Informational [Page 10]
|