<?xml version="1.0"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [

<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC4627 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4627.xml">
<!ENTITY RFC6838 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6838.xml">
<!ENTITY RFC3629 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3629.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc category="std" docName="draft-bray-i-json-01" ipr="trust200902">
  <!-- ***** FRONT MATTER ***** -->

  <front>
    <title>The I-JSON Message Format</title>

    <author fullname="Tim Bray" initials="T." role="editor"
            surname="Bray">
      <organization>Google, Inc.</organization>

      <address>
        <email>tbray@textuality.com</email>
	<uri>https://www.tbray.org/</uri>
      </address>
    </author>

    <date year="2014" month="January" />
    <area>Applications</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>JSON</keyword>

    <abstract>
      <t>I-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>RFC4627bis 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 which 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.  RFC4627 describes practices
      which 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 RFC4627bis
      but with certain extra constraints which 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 
	RFC4627bis.</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 object, as defined by RFC4626bis.
      This allows protocol designers to add new data items to messages, should
      that become necessary, without breaking existing deployments. In other
      words, it makes a Must-Ignore policy possible.</t>

      <t>When an I-JSON message is transmitted over the Internet, since it is
      a JSON text as defined in RFC4627bis, it may be described using the
      Internet Media Type "application/json".  Specifications whose messages
      are specified to be I-JSON messages SHOULD specify the use of a media
      type of the form "application/XXX+i-json", where XXX is specific to the
      specification.</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 which identify Surrogates or
	Noncharacters.</t>
	<t>This applies both to characters encoded directly in UTF-8
	and to those which are escaped; thus, "\uDEAD" is always illegal.</t>
      </section>
      
      <section title="Numbers">
	<t>Software which implements IEEE 754-2008 binary64 (double
	precision) numbers [IEEE754] is generally available and widely used.
	Implementations which generate I-JSON messages MUST NOT 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 which express greater magnitude or
	precision than an IEEE 754 double precision number provides, for
	example 1E400 or 3.141592653589793238462643383279.</t>
	<t>For applications such as cryptography, where much larger numbers
	are reasonably required, it is RECOMMENDED to encode them in JSON
	string values. This requires that the receiving program understand
	the intended semantic of the value.</t>
      </section>
      
      <section title="Object constraints">
	<t>Objects in I-JSON messages MUST NOT have members with duplicate
	names.</t>
	<t>Implementations which generate I-JSON messages MUST NOT assume that
	the order of object members in those messages is available to software
	which receives them.</t>
      </section>
    </section>
      
    <section anchor="Behavior" title="Software Behavior">
      <t>When software reads data which it expects to be an I-JSON message,
      but the data violates one of the MUST constraints in the previous section
      (for example, contains an object with a duplicate key, or a  UTF-8
      encoding error), that software MUST NOT trust nor act on the content of
      the message.</t>
      <t>Designers of protocols which 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="Acknowledgements" title="Acknowledgements">
      <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 RFC4627bis on the IETF JSON
      Working Group.</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>All the security considerations which apply to JSON (see RFC4627bis)
      apply to I-JSON.  There are no additional security considerations
      specific to I-JSON.</t>
    </section>
  </middle>

  <!--  *****BACK MATTER ***** -->
  <back>

    <references title="Normative References">
      <!--?rfc
	  include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->
      &RFC2119;
      &RFC4627;
      &RFC6838;
      &RFC3629;
      <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>
      </reference>

      

    </references>

  </back>
</rfc>
