<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [

<!ENTITY RFC2119 SYSTEM "bibxml/reference.RFC.2119.xml">
<!ENTITY RFC3629 SYSTEM "bibxml/reference.RFC.3629.xml">
<!ENTITY RFC7159 SYSTEM "bibxml/reference.RFC.7159.xml">
<!ENTITY RFC3339 SYSTEM "bibxml/reference.RFC.3339.xml">
<!ENTITY RFC4627 SYSTEM "bibxml/reference.RFC.4627.xml">
<!ENTITY RFC4648 SYSTEM "bibxml/reference.RFC.4648.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc rfcedstyle="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>

<rfc number="7493" submissionType="IETF" category="std" ipr="trust200902" xmlns:x='http://purl.org/net/xml2rfc/ext'>
  <!-- ***** FRONT MATTER ***** -->

  <front>
    <title>The I-JSON Message Format</title>

    <author fullname="Tim Bray" initials="T." role="editor"
            surname="Bray">
      <organization>Textuality Services</organization>

      <address>
        <email>tbray@textuality.com</email>
	<uri>https://www.tbray.org/</uri>
      </address>
    </author>

    <date year="2015" month="March" />

    <keyword>JSON</keyword>


    <abstract>
      <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to
      maximize interoperability and increase confidence that software can
      process it successfully with predictable results.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t>RFC 7159 describes the JSON data interchange format, which is
      widely used in Internet protocols.  For historical reasons, that
      specification allows the use of language idioms and text encoding
      patterns that are likely to lead to interoperability problems and
      software breakage, particularly when a program receiving JSON data uses
      automated software to map it into native programming-language
      structures or database records.  RFC 7159 describes practices
      that may be used to avoid these interoperability problems.</t>

      <t>This document specifies I-JSON, short for "Internet JSON".
      The unit of definition is the "I-JSON message".
      I-JSON messages are also "JSON texts" as defined in RFC 7159
      but with certain extra constraints that enforce the good
      interoperability practices described in that specification.</t>

      <section title="Terminology">
	<t>The terms "object", "member", "array", "number", "name", and
	"string" in this document are to be interpreted as described in
	<xref target="RFC7159">RFC 7159</xref>.</t>
      </section>
      <section title="Requirements Language">
        <t>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 <xref
        target="RFC2119">RFC 2119</xref>.</t>
      </section>
    </section>

    <section title="I-JSON Messages">
      <t>An I-JSON message is a JSON text, as defined by RFC 7159.</t>

      <section title="Encoding and Characters">
	<t>I-JSON messages MUST be encoded using UTF-8
	<xref target="RFC3629" />.</t>
	<t>Object member names, and string values in arrays and object members,
	MUST NOT include code points that identify Surrogates or
	Noncharacters as defined by <xref target="UNICODE"/>.</t>

	<t>This applies both to characters encoded directly in UTF-8
	and to those which are escaped; thus, "\uDEAD" is invalid
	because it is an unpaired surrogate, while "\uD800\uDEAD"
	would be legal.</t>
      </section>
      
      <section title="Numbers">
	<t>Software that implements IEEE 754-2008 binary64 (double
	precision) numbers <xref target="IEEE754"/> is generally available and
	widely used.
	Implementations that generate I-JSON messages cannot assume that
	receiving implementations can process numeric values with greater
	magnitude or precision than provided by those numbers. I-JSON messages
	SHOULD NOT include numbers that express greater magnitude or
	precision than an IEEE 754 double precision number provides, for
	example, 1E400 or 3.141592653589793238462643383279.</t>
	<t>An I-JSON sender cannot expect a receiver to treat
	an integer whose absolute value is greater than 9007199254740991 (i.e.,
	that is outside the range [-(2<sup>53</sup>)+1, (2<sup>53</sup>)-1]) as an exact
	value.</t> 

	<t>For applications that require the exact interchange of numbers with
	greater magnitude or precision, it is RECOMMENDED to
	encode them in JSON string values. This requires that the receiving
	program understand the intended semantic of the value.  An example
	would be 64-bit integers, even though modern hardware can deal with
	them, because of the limited scope of JavaScript numbers.</t>
      </section>
      
      <section title="Object Constraints">
	<t>Objects in I-JSON messages MUST NOT have members with duplicate
	names.  In this context, "duplicate" means that the names, after
	processing any escaped characters, are identical sequences of Unicode
	characters.</t>
 	<t>The order of object members in an I-JSON message does not change the
 	meaning of an I-JSON message. A receiving implementation MAY treat  
 	two I-JSON messages as equivalent if they differ only in the order of
 	the object members.</t>
      </section>
    </section>
      
    <section anchor="Behavior" title="Software Behavior">
      <t>A major advantage of using I-JSON is that receivers can avoid
      ambiguous semantics in the JSON messages they receive. This allows
      receivers to reject or otherwise disregard messages that do not
      conform to the requirements in this document for I-JSON messages.
      Protocols that use I-JSON messages can be written so that receiving
      implementations are required to reject (or, as in the case of security
      protocols, not trust) messages that do not satisfy the constraints of
      I-JSON.</t>
      <t>Designers of protocols that use I-JSON messages SHOULD provide
      a way, in this case, for the receiver of the erroneous data to signal
      the problem to the sender.</t>
    </section>      

    <section anchor="Recommendation" title="Recommendations for Protocol Design"> 
      <t>I-JSON is designed for use in Internet protocols.  The following
      recommendations apply to the use of I-JSON in such protocols.</t>
      <section anchor="TopLevel" title="Top-Level Constructs">
	<t>An I-JSON message can be any JSON value. However, there are
	software implementations, coded to the older specification
	<xref target="RFC4627" />, which only accept JSON
	objects or JSON arrays at the top level of JSON texts. For maximum
 	interoperability with such implementations, protocol designers
 	SHOULD NOT use top-level JSON texts that are
	neither objects nor arrays.</t>
      </section>
      <section anchor="MustIgnore" title="Must-Ignore Policy">
	<t>It is frequently the case that changes to protocols are required
	after they have been put in production.  Protocols that allow the
	introduction of new protocol elements in a way that does not disrupt
	the operation of existing software have proven advantageous in
	practice.</t>
 	<t>This can be referred to as a "Must-Ignore" policy, meaning that when
 	an implementation encounters a protocol element that it does not
 	recognize, it should treat the rest of the protocol transaction as if
 	the new element simply did not appear, and in particular, the implementation MUST NOT
 	treat this as an error condition. The converse "Must-Understand"
 	policy does not tolerate the introduction of new protocol elements,
 	and while this has proven necessary in certain protocol designs, in
 	general it has been found to be overly restrictive and brittle.</t>
	<t>A good way to support the use of Must-Ignore in I-JSON protocol
	designs is to require that top-level protocol elements must be JSON
	objects, and to specify that members whose names are unrecognized MUST
	be ignored.</t>
      </section>
      <section anchor="Dates" title="Time and Date Handling">
	<t>Protocols often contain data items that are designed to contain
	timestamps or time durations.  It is RECOMMENDED that all such
	data items be expressed as string values in ISO 8601 format, as
	specified in <xref target="RFC3339" />, with the additional
	restrictions that uppercase rather than lowercase letters be used,
	that the timezone be included not defaulted, and that optional trailing
	seconds be included even when their value is "00".
	It is also RECOMMENDED that all data items containing time durations
	conform to the "duration" production in <xref target="RFC3339" x:fmt="sec" x:sec="A"/> of RFC 3339, with
	the same additional restrictions.</t>
      </section>
      <section anchor="Binary" title="Binary Data">
	  <t>When it is required that an I-JSON protocol element contain
	  arbitrary binary data, it is RECOMMENDED that this data be
	  encoded in a string value in base64url; see
	  <xref target="RFC4648" x:fmt="of" x:sec="5"/>.</t>
      </section>
    </section>


    <section anchor="Security" title="Security Considerations">
      <t>All the security considerations that apply to JSON (see RFC 7159)
      apply to I-JSON.  There are no additional security considerations
      specific to I-JSON.</t>
      <t>Since I-JSON forbids the use of certain JSON idioms that can lead
      to unpredictable behavior in receiving software, it may prove 
      a more secure basis for Internet protocols and may be a good choice
      for protocol designers with special security needs.</t>
    </section>
  </middle>

  <!--  *****BACK MATTER ***** -->
  <back>

    <references title="Normative References">

      &RFC2119;
      &RFC3629;
      &RFC7159;
      &RFC3339;
      &RFC4627;
      &RFC4648;
      <reference anchor="IEEE754" target="http://grouper.ieee.org/groups/754/">
	<front>
	  <title abbrev="IEEE 754">IEEE Standard for Floating-Point
	  Arithmetic</title> 
	  <author>
	    <organization>IEEE</organization>
	    <address />
	  </author>
	  <date year="2008"/>
	</front>
<seriesInfo name="IEEE" value="754-2008"/>
      </reference>
      <reference anchor="UNICODE" target="http://www.unicode.org/versions/latest/">
	<front>
	  <title abbrev="Unicode">The Unicode Standard</title>
	  <author>
	    <organization>The Unicode Consortium</organization>
	    <address />
	  </author>
	  <date />
	</front>

<!--
	<annotation>Note that this reference is to the latest version of
	Unicode, rather than to a specific release. It is not expected that
	future changes in the UNICODE specification will affect the referenced
	classifications.</annotation>
-->
</reference>
    </references>

    <section anchor="Acknowledgements" title="Acknowledgements" numbered="false">
      <t>I-JSON is entirely dependent on the design of JSON, largely
      due to Douglas Crockford.  The specifics were strongly influenced
      by the contributors to the design of RFC 7159 in the IETF JSON
      Working Group.</t>
    </section>

  </back>
</rfc>
