Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

file 563 lines (325 sloc) 16.318 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563






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]

Something went wrong with that request. Please try again.