RFC 4627 INFORMATIONAL DATA FORMATS · MIME TYPES

The application/json Media Type for JavaScript Object Notation (JSON)

Registers the application/json media type for JavaScript Object Notation.

On rfc-editor.org ↗
PUBLISHED
July 2006
AUTHORS
D. Crockford
STREAM
IETF
OBSOLETED BY
RFC 7159 — JSON (old)
TYPE
Informational
YEAR
July 2006
MEDIA TYPE
application/json
DOI
10.17487/RFC4627
ERRATA
Reported errata

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
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.

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
   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.

         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".

         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.

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
   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]
        }
   }

   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.

   [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

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).

AI ELI5

On this page
PROBLEMJSON is a widely-used data format derived from JavaScript, but it lacked an official MIME media type for email and web applications.
MECHANISMRFC 4627 formally registers 'application/json' as the media type for JSON, specifies the JSON grammar and encoding rules, and documents how JSON generators and parsers must behave.
WHY IT MATTERSJSON became the standard data interchange format for web APIs and applications. RFC 7159 later updated this specification with clarifications.

§1What Is JSON

JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It is derived from the object literals of JavaScript as defined in the ECMAScript Programming Language Standard.

JSON can represent four primitive types: strings (sequences of Unicode characters), numbers, booleans (true and false), and null. It also has two structured types: objects (unordered collections of name/value pairs where names are strings and values can be any JSON type) and arrays (ordered sequences of zero or more values).

The design goals for JSON were to be minimal (with a small set of formatting rules), portable (language-independent), textual (human-readable), and a subset of JavaScript (so JSON can be safely parsed with JavaScript's eval() function).

JSON is a simple format that describes data using curly brackets for containers and square brackets for lists. It can store text, numbers, true/false, and null (empty).

§2JSON Grammar and Syntax

A JSON text is a sequence of tokens consisting of six structural characters, strings, numbers, and three literal names. JSON data must be either a serialized object or an array.

The six structural characters are: [ (begin array), ] (end array), { (begin object), } (end object), : (name separator), and , (value separator). Whitespace (space, tab, line feed, and carriage return) is allowed before or after these characters.

A value must be either an object, array, number, string, or one of three literal names: false, null, or true (always lowercase). An object is surrounded by curly brackets and contains zero or more name/value pairs separated by commas. An array is surrounded by square brackets and contains zero or more values separated by commas.

Numbers consist of an optional minus sign, an integer component, an optional fraction part (decimal point followed by digits), and an optional exponent part. Octal and hexadecimal forms, leading zeros, and special values like Infinity or NaN are not permitted.

JSON uses curly brackets for objects, square brackets for arrays, and colons to separate a name from a value. Numbers, text, true/false, and null are the simple values you can store.

§3Strings and Character Encoding

A string in JSON is a sequence of zero or more Unicode characters enclosed in quotation marks. Characters that must be escaped are: the quotation mark, reverse solidus (backslash), and control characters (U+0000 through U+001F).

Any character may be escaped using a backslash followed by specific codes: \" for quotation mark, \\ for backslash, \/ for solidus, \b for backspace, \f for form feed, \n for line feed, \r for carriage return, \t for tab, or \u followed by four hexadecimal digits for other Unicode characters.

JSON text MUST be encoded in Unicode with UTF-8 as the default encoding. The RFC provides a method to detect whether an octet stream uses UTF-8, UTF-16 (big-endian or little-endian), or UTF-32 (big-endian or little-endian) by examining the pattern of null bytes in the first four octets.

JSON uses backslash escape codes to include special characters in text, like \n for a line break or \" for a quote mark. JSON is always Unicode text, usually in UTF-8 format.

§4Parsers and Generators

A JSON parser transforms a JSON text into another representation. A compliant parser MUST accept all texts that conform to the JSON grammar. A parser may accept non-JSON forms or extensions, and it may set limits on the size of texts, the maximum depth of nesting, the range of numbers, and the length and character contents of strings.

A JSON generator produces JSON text. The resulting text MUST strictly conform to the JSON grammar. Generators are responsible for ensuring syntactically correct output.

A parser is a program that reads JSON and turns it into something the program can use. A generator is a program that creates JSON.

§5MIME Media Type Registration

The MIME media type for JSON is application/json. The type name is 'application' and the subtype is 'json'. There are no required or optional parameters.

JSON encoding considerations depend on the Unicode encoding used: JSON is 8-bit compatible when written in UTF-8, but when using UTF-16 or UTF-32, the binary content-transfer-encoding must be used.

The specification notes that JSON applications include ActionScript, C, C#, ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme.

application/json is the official label that tells email systems and web browsers that a file contains JSON data. Files can use the .json extension.

§6Security Considerations

The RFC notes general security issues with scripting languages. JSON is a subset of JavaScript, but a safe subset that excludes assignment and invocation, preventing malicious code execution.

A JSON text can be safely processed by JavaScript's eval() function (which compiles and executes a string) if all non-string characters are valid JSON tokens. The RFC provides a verification method using regular expressions: the implementation tests against forbidden characters, removes legitimate string content, and safely evaluates the result.

JSON is safe to process through JavaScript because it doesn't allow code execution like regular JavaScript does. Special characters in text are protected with backslash escapes.

§7References