Skip to main content

JSON semantic format (JSON-NTV)
draft-thomy-json-ntv-03

Document Type Active Internet-Draft (individual)
Author THOMY Philippe
Last updated 2024-05-27
RFC stream (None)
Intended RFC status (None)
Formats
Additional resources GitHub Repository
Stream Stream state (No stream defined)
Consensus boilerplate Unknown
RFC Editor Note (None)
IESG IESG state I-D Exists
Telechat date (None)
Responsible AD (None)
Send notices to (None)
draft-thomy-json-ntv-03
Internet Engineering Task Force                                 P. THOMY
Internet-Draft                                                 Loco-labs
Intended status: Informational                               27 May 2024
Expires: 28 November 2024

                    JSON semantic format (JSON-NTV)
                        draft-thomy-json-ntv-03

Abstract

   This document describes a set of simple rules for unambiguously and
   concisely encoding semantic data into JSON Data Interchange Format.
   These rules are based on an NTV (Named and Typed Values) data
   structure applicable to any simple or complex data.

   The JSON-NTV format is its JSON translation.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on 28 November 2024.

Copyright Notice

   Copyright (c) 2024 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (https://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights
   and restrictions with respect to this document.  Code Components
   extracted from this document must include Revised BSD License text as
   described in Section 4.e of the Trust Legal Provisions and are
   provided without warranty as described in the Revised BSD License.

THOMY                   Expires 28 November 2024                [Page 1]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
     1.1.  Presentation  . . . . . . . . . . . . . . . . . . . . . .   3
     1.2.  Key design features . . . . . . . . . . . . . . . . . . .   4
     1.3.  Conventions Used in This Document . . . . . . . . . . . .   5
   2.  NTV structure . . . . . . . . . . . . . . . . . . . . . . . .   6
     2.1.  NTV layers  . . . . . . . . . . . . . . . . . . . . . . .   6
     2.2.  NTV entities  . . . . . . . . . . . . . . . . . . . . . .   7
       2.2.1.  NTVsingle . . . . . . . . . . . . . . . . . . . . . .   7
       2.2.2.  NTVlist . . . . . . . . . . . . . . . . . . . . . . .   8
     2.3.  DataType and Namespace  . . . . . . . . . . . . . . . . .   8
       2.3.1.  Namespace . . . . . . . . . . . . . . . . . . . . . .   9
       2.3.2.  DataType  . . . . . . . . . . . . . . . . . . . . . .   9
       2.3.3.  Representation  . . . . . . . . . . . . . . . . . . .  10
   3.  JsonNTV . . . . . . . . . . . . . . . . . . . . . . . . . . .  11
     3.1.  JsonNTV format  . . . . . . . . . . . . . . . . . . . . .  11
     3.2.  JsonNTVname . . . . . . . . . . . . . . . . . . . . . . .  13
     3.3.  JsonNTVtype . . . . . . . . . . . . . . . . . . . . . . .  13
     3.4.  JsonNTVvalue  . . . . . . . . . . . . . . . . . . . . . .  14
   4.  Examples  . . . . . . . . . . . . . . . . . . . . . . . . . .  15
   5.  Parsing a JsonValue . . . . . . . . . . . . . . . . . . . . .  17
     5.1.  JSON decoding . . . . . . . . . . . . . . . . . . . . . .  18
     5.2.  NTV entity decoding . . . . . . . . . . . . . . . . . . .  18
     5.3.  NTVvalue decoding . . . . . . . . . . . . . . . . . . . .  19
     5.4.  NTVtype decoding  . . . . . . . . . . . . . . . . . . . .  19
   6.  Properties  . . . . . . . . . . . . . . . . . . . . . . . . .  20
     6.1.  NTV tree  . . . . . . . . . . . . . . . . . . . . . . . .  20
     6.2.  NTV Pointer . . . . . . . . . . . . . . . . . . . . . . .  20
     6.3.  NTV Comparison  . . . . . . . . . . . . . . . . . . . . .  21
     6.4.  NTV Canonical . . . . . . . . . . . . . . . . . . . . . .  22
     6.5.  JSON as a subtype of NTV  . . . . . . . . . . . . . . . .  22
     6.6.  extended NTV structure  . . . . . . . . . . . . . . . . .  23
     6.7.  nested NTVsingle entities . . . . . . . . . . . . . . . .  23
   7.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  24
   8.  Security Considerations . . . . . . . . . . . . . . . . . . .  25
   9.  References  . . . . . . . . . . . . . . . . . . . . . . . . .  25
     9.1.  Normative References  . . . . . . . . . . . . . . . . . .  25
     9.2.  Informative References  . . . . . . . . . . . . . . . . .  26
   Appendix A.  Global DataType and Namespace  . . . . . . . . . . .  26
     A.1.  Json  . . . . . . . . . . . . . . . . . . . . . . . . . .  27
     A.2.  Numbers . . . . . . . . . . . . . . . . . . . . . . . . .  27
     A.3.  Binary encoding . . . . . . . . . . . . . . . . . . . . .  28
     A.4.  Datation  . . . . . . . . . . . . . . . . . . . . . . . .  28
     A.5.  Period and Duration . . . . . . . . . . . . . . . . . . .  30
     A.6.  Location  . . . . . . . . . . . . . . . . . . . . . . . .  30
     A.7.  Structured data . . . . . . . . . . . . . . . . . . . . .  32
     A.8.  Normalized String . . . . . . . . . . . . . . . . . . . .  32

THOMY                   Expires 28 November 2024                [Page 2]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

     A.9.  Namespace . . . . . . . . . . . . . . . . . . . . . . . .  34
     A.10. Custom DataType and Namespace . . . . . . . . . . . . . .  34
   Appendix B.  Complete ABNF notation . . . . . . . . . . . . . . .  35
   Appendix C.  JSON-NTV equivalence . . . . . . . . . . . . . . . .  37
   Appendix D.  Mapping DataTypes  . . . . . . . . . . . . . . . . .  39
     D.1.  Table-Schema  . . . . . . . . . . . . . . . . . . . . . .  39
     D.2.  JSON Schema . . . . . . . . . . . . . . . . . . . . . . .  40
     D.3.  YANG  . . . . . . . . . . . . . . . . . . . . . . . . . .  42
   Acknowledgements  . . . . . . . . . . . . . . . . . . . . . . . .  42
   Contributors  . . . . . . . . . . . . . . . . . . . . . . . . . .  42
   Author's Address  . . . . . . . . . . . . . . . . . . . . . . . .  43

1.  Introduction

1.1.  Presentation

   The semantic level of JSON or CSV shared data remains low.  It is
   often limited to the type of data defined in those exchange formats
   (strings for CSV formats; numbers, strings, arrays and objects for
   JSON formats).

   JSON-NTV proposes to increase the semantic level of the JSON entities
   [RFC8259] by adding two additional pieces of information to a JSON
   entity :

   *  *name*: interpretation of the JSON value in human language or
      detailed information or link to external information,

   *  *type*: interpretation of the JSON value in a data standard (eg.
      GeoJSON, datetime), in a data catalog or in a software language.

   The NTV entity is thus a triplet with a mandatory element (value) and
   two additional elements (name, type).

      _For example, Paris location can be represented by :_

      -  _a name : "paris",_
      -  _a type : geoJSON Point coordinates [RFC7946],_
      -  _a value : [2.3522, 48.8566]_

   The easiest way to add that information into a JSON value is to use a
   JSON object with a single member.  The first term is the additional
   elements using the syntax JSON-ND [JSON-ND].  The second term is the
   JSON value.

      _The JSON value of the previous example is:_

         _{ "paris:point" : [2.3522, 48.8566] }_

THOMY                   Expires 28 November 2024                [Page 3]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   With this approach, two NTV entities are defined :

   *  *a primitive entity* which is not composed of any other entity,

   *  *a structured entity* which is an ordered sequence of NTV
      entities.

   as well as two JSON formats depending on the presence of the
   additional elements :

   *  *simple format* when name and type are not present

   *  *named format* when name or type is present

      _Example (entity composed of two other primitive entities):_

         _{ "cities::point": [[2.3522, 48.8566], [4.8357, 45.7640]] }
         simple format for primitive entities_
         _{"cities::point": {"paris":[2.3522, 48.8566], "lyon":[4.8357,
         45.7640]}} named format for primitive entities_

   A JSON-NTV generator produces a JSON value from a NTV entity and vice
   versa a JSON-NTV parser transforms a JSON value into a NTV entity.

   The document [NTV-TAB] presents a variation of this format for
   tabular and multidimensional data.

   The conversion between NTV entity and native entity is outside the
   scope of this note.

1.2.  Key design features

   The format is focused on simplicity, lightness and web usage.

   The key features of this format are the following:

   *  *JSON as the base format*

      -  JSON is simple and readable as simple text

      -  JSON supports rich structure including nesting and basic types

      -  JSON is web-native and very widely used and supported

      -  JSON format has binary representation (eg.  CBOR format)

   *  *high semantic level of data*

THOMY                   Expires 28 November 2024                [Page 4]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

      -  wide variety of data typing

      -  tree-like and customisable data typing

   *  *compatibility with existing formats*

      -  All JSON data is a JsonNTV data

      -  All NTVtypes are standard types

   *  *compatibility with any type of platform*

      -  types and structures are independent of software and hardware
         platforms

      -  the NTV concept is applicable to all types of "jsonable" data

   *  *reversibility*

      -  the NTV entity coming from a JSON value is identical to the NTV
         entity from which the JSON value comes

      -  the JSON representation of an NTV entity is the same as the
         JSON value used to construct the NTV entity

   *  *tree structure*

      -  all NTV entities are trees

      -  tree properties are applicable to NTV entities

1.3.  Conventions Used in This Document

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in BCP
   14 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

   This document also uses the following terms:

   *JsonText, JsonMember, JsonElement :*
      These terms are defined as text, member, element in the JSON
      grammar [RFC8174].

THOMY                   Expires 28 November 2024                [Page 5]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   *JsonValue, JsonObject, JsonArray, JsonNumber, JsonString,
   JsonFalse, JsonNull, JsonTrue:*
      These terms correspond to entities whose representation is defined
      as value, object, array, number, string, false, null, true in the
      JSON grammar [RFC8174].

   *JsonPrimitive:*
      A JsonNumber, JsonString, JsonFalse, JsonTrue or JsonNull.

   *JsonUnnamed:*
      A JsonObject without a single member.

   *JsonNamed:*
      A JsonObject with a single member.

   *NTVsingle, NTVlist:*
      NTVlist and NTVsingle entities can be abbreviated as:

      *  NVsingle : entity with default NTVtype "json",

      *  NVlist : entity without NTVtype,

      *  TVsingle, TVlist : entity without NTVname,

      *  Vsingle, Vlist : NVsingle or NVlist without NTVname.

2.  NTV structure

2.1.  NTV layers

   NTV and JsonNTV structures are defined as shown in Figure 1:

   *  NTV is a data triplet (NTVname, NTVtype, NTVvalue) that contains
      all the information needed to build the native entity.

   *  JsonNTV is the JsonValue of the NTV entity.  JsonNTV is used to
      build an interchangeable JsonText

   +--------+ JSON load +-------+ NTV load +-------+  to_obj  +------+
   |        |---------->|       |--------->|  NTV  |--------->|native|
   |JsonText|           |JsonNTV|          |triplet|          |entity|
   |        |<----------|       |<---------|       |<---------|      |
   +--------+ JSON dump +-------+ NTV dump +-------+ from_obj +------+

                            Figure 1: NTV layers

   _Example:_

THOMY                   Expires 28 November 2024                [Page 6]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   *  _Native layer_

         new_year_2022 = datetime.date(2022, 01, 01) _is a Python
         variable "new_year_2022" corresponding to a datetime object_

   *  _NTV layer_

         ("new_year_2022", "date", "2022-01-01") _is a triplet_

   *  _JsonNTV layer_

         { "new_year_2022:date" : "2022-01-01" } _is a JsonValue_

   *  _JsonText layer_

         '{"new_year_2022:date":"2022-01-01"}' _is a JsonString_

2.2.  NTV entities

   Two categories of entities (one primitive and one structured) are
   defined:

   *  *NTVsingle* for the primitive entity,

   *  *NTVlist* for an ordered sequence of NTV entities

   An NTV entity is therefore a tree where the leaves nodes are the
   NTVsingle entities and where the inner nodes are the NTVlist entities

2.2.1.  NTVsingle

   The data triplet of NTVsingle entities is composed by:

   *  *NTVsingleValue*: This NTVvalue is the JSON representation
      (JsonValue) of the main content of the NTV entity,

   *  *NTVsingleType*: This NTVtype is a DataType.  It defines the type
      of entity and the conversion rules between the native entity and
      the NTV entity.  The default NTVtype (defaultNTVtype) is the
      "json" DataType.

   *  *NTVname*: The NTVname is an additional textual information
      (JsonString)

   *In other words, any entity that has on the one hand a function of
   encoding it into a JsonValue and on the other hand a function of
   creating from a JsonValue can be taken into account.  This approach
   is very general because the majority of computer objects are defined

THOMY                   Expires 28 November 2024                [Page 7]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   by a list of parameters (e.g. *args in python) and/or a list of key/
   values (e.g. **kwargs in python) which simply translate into a
   JsonArray or a JsonObject.*

   The consistency between NTVsingleValue and NTVsingleType is outside
   the scope of this note.

2.2.2.  NTVlist

   The data triplet of NTVlist entities is composed by:

   *  *NTVlistValue*: This NTVvalue is an ordered sequence of included
      NTV entities.

   *  *NTVlistType*: This NTVtype is a Namespace or a DataType to apply
      to the NTV entities included.  This NTVlistType avoids including a
      NTVtype (if DataType) or reduces the length (if Namespace) in the
      JSON representation (JsonNTV) of the included NTV entities.  The
      default NTVtype (defaultNTVtype) is "None".

   *  *NTVname*: The NTVname is an additional textual information
      (JsonString)

   _Example of equivalent JSON representations:_

      _where NTVlistType is None for the global NTVlist_

         _[ { ":point" : [2.3522, 48.8566]}, {":point" : [4.8357,
         45.7640]} ]_

      _where NTVlistType is "point" for the global NTVlist_

         _{ "::point" : [ [2.3522, 48.8566], [4.8357, 45.7640] ] }_

   _If JsonValue is { "::dat" : ["2022-01-28T18-23-54", {":point": [1.1,
   2.2] ] } }, the parsers deduce that the first NTVvalue has a "dat"
   NTVtype and the second a "point" NTVtype._

2.3.  DataType and Namespace

   A DataType is defined in a nested structure called Namespace.

   This structuring of type makes it possible to reference any type of
   data that has a JSON representation and to consolidate all the shared
   data structures within the same tree of types.

THOMY                   Expires 28 November 2024                [Page 8]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

2.3.1.  Namespace

   A Namespace is defined by a name (NamespaceName) and a Namespace
   parent (NamespaceParent).  The NamespaceName is unique in the
   NamespaceParent.

   Root node in the Namespace tree is the GlobalNamespace.

      REQ1:  NamespaceParent of GlobalNamespace is None.

2.3.2.  DataType

   The DataType represents the semantic of a data and is structured in a
   flat classification.  For example, "email" and "string" are two
   DataType.

   A DataType is composed with a TypeBase and an optional TypeExtension.
   The TypeExtension defines an additional property.  For example:

   *  a "float" TypeBase may have a "kg" extension to indicate a unit.

   *  a "string" TypeBase may have a "fr" extension to indicate a
      langage.

   A DataType is defined by a name (DataTypeName) and a Namespace parent
   (NamespaceParent).  The TypeBase of a DataType is unique in the
   NamespaceParent.  The TypeExtension of a DataType is free.

   TypeBase and the rules to encode or decode NTVvalues MUST be
   understood by data producers and data consumers.  So TypeBase and
   rules associated have to be defined in a specification shared by a
   large community.  On the other hand, it must be possible for everyone
   to share data according to their own data structure.

   There are therefore two categories of TypeBase:

   *  custom TypeBase (and Namespace) which can be created by anyone
      without control,

   *  shared TypeBase (and Namespace) that are defined in a single,
      shared repository.  Each 'shared' Namespace or TypeBase is
      uniquely managed.

   For shared TypeBase, three sub-categories are defined (None, Simple,
   Generic).

   *  The "None" TypeBase is used with NTVlist as defaultDataType.

THOMY                   Expires 28 November 2024                [Page 9]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   *  Simple TypeBase is associated to conversion rules between a native
      entity and a NTV entity.

   *  Generic TypeBase is equivalent to a set of Simple TypeBase.  This
      indicates that parsers use associated simple TypeBase to decode
      the JsonNTVvalue.

   _Example:_

      _"dat" is the generic TypeBaseName for "datetime" and "timeposix"_

      _If a JSONvalue is { "::dat" : ["2022-01-28T18-23-54", 123456.78]
      }, the parser deduces that the first entity has a "datetime"
      TypeBaseName and the second a "timeposix" TypeBaseName._

2.3.3.  Representation

   A Namespace is defined by a string followed by a point
   (NamespaceName).

   A DataType is defined by a string (DataTypeName) composed by the
   TypeBaseName and the TypeExtensionName.

   The representation of a Namespace (NamespaceLongName) is composed by
   all the nested NamespaceName.

   The representation of a DataType (DataTypeLongName) is composed by
   the NamespaceLongName and the DataTypeName.

   The DataTypeLongName is defined in Figure 2, which uses ABNF from
   [RFC5234].

   ; representation of DataType and Namespace (Name and LongName)

   DataTypeLongName  = NamespaceParentLongName DataTypeName

   NamespaceLongName = NamespaceParentLongName NamespaceName
   NamespaceParentLongName = NamespaceLongName

   NamespaceName   = [ ["$"] JsonString "." ]      ; REQ2 REQ3
   DataTypeName    = TypeBaseName ["[" TypeExtensionName "]"]
   TypeBaseName    = ["$"] JsonString              ; REQ3
   TypeExtensionName   = JsonString

               Figure 2: DataType and Namespace names - ABNF

   The corresponding rules are as follows:

THOMY                   Expires 28 November 2024               [Page 10]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

      REQ2:  NamespaceName and NamespaceLongName of GlobalNamespace are
             empty.

      REQ3:  DataType (or Namespace) has 'custom' category if
             DataTypeName (or NamespaceName) begins with '$' or
             NamespaceParent has 'custom' category

   _Example for a representation of a DataType defined in two nested
   Namespace in the global Namespace:_

      _"ns1.ns2.type"_

      _where:_

         _"ns1." is a NamespaceName of a Namespace defined in the global
         Namespace,_

         _"ns2." is a NamespaceName of a Namespace defined in the "ns1"
         Namespace,_

         _"type" is a DataTypeName of a DataType defined in the "ns2"
         Namespace_

   _Example of custom categories:_

      _If "fr." is the name of a Namespace attached to the global
      Namespace and containing the Namespace 'BAN' and the DataType
      'dep', then:_

      -  _"fr.dep" is a name of a shared DataType,_

      -  _"fr.$test" is a name of a custom DataType,_

      -  _"fr.$example.one" is a name of a custom DataType_

      -  _"fr.BAN.$test" is a name of a custom DataType_

3.  JsonNTV

3.1.  JsonNTV format

   The JsonNTV format is the JSON representation of an NTV entity
   (JsonValue).  This JsonValue is converted in JsonText with a Json
   generator.

   The JsonNTV format is defined in Figure 3, which uses ABNF from
   [RFC5234].

THOMY                   Expires 28 November 2024               [Page 11]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   ; JSON representation of NTV entities (JsonNTV)

   JsonNTV        = JsonNTVnamed / JsonNTVsimple      ; REQ4

   JsonNTVnamed   = beginObject JsonNTVMember endObject
   JsonNTVsimple  = JsonNTVvalue

   JsonNTVMember  = JsonNTVname nSep JsonNTVvalue

   ; Extract of JSON grammar used in this document

   beginArray    = ws "[" ws
   beginObject   = ws "{" ws
   endArray      = ws "]" ws
   endObject     = ws "}" ws
   nSep          = ws ":" ws
   vSep          = ws "," ws
   ws = *( %x20 / %x09 / %x0A / %x0D )

   JsonValue  = JsonValue   ; indicates that rule is defined in RFC8259
   JsonString = JsonString  ; indicates that rule is defined in RFC8259

                          Figure 3: JsonNTV - ABNF

   The JsonNTV format is built with the NTVname, NTVvalue and the
   JsonNTVtype.

   Two JsonNTV formats are defined:

   *  named format:

         _{ JsonNTVname : JsonNTVvalue }_

   *  simple format:

         _JsonNTVvalue_

   The corresponding rule is as follows:

      REQ4:  If JsonNTVname is empty, simple format is used else named
             format is used

   _Note :_

   *  _JsonNTV : 21, { ":" : 21 } and { ":json" : 21 } represent the
      same Vsingle entity._

THOMY                   Expires 28 November 2024               [Page 12]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   *  _If JsonNTVvalue is a JsonObject with a single member, the
      JsonNTVname is not empty._

3.2.  JsonNTVname

   JsonNTVname is the concatenation of NTVname and JsonSepType.

   JsonSepType is composed with the separator singleSep or listSep and
   the JsonNTVtype.

   JsonNTVname and JsonSepType are defined in Figure 4, which uses ABNF
   from [RFC5234].

   ; JSON representation of NTVname and NTVtype (JsonNTVname)

   JsonNTVname = NTVname JsonSepType
   JsonSepType = [singleSep [JsonNTVtype]]/([listSep] JsonNTVtype)
       ; REQ5 REQ6

   NTVname = JsonString

   singleSep   = ":"      ; NTVsingle separator
   listSep     = "::"     ; NTVlist separator

                        Figure 4: JsonNTVname - ABNF

   For NTVsingle entities:

      REQ5:  If JsonNTVtype is not "json", JsonSepType is identical to
             singleSep joined with JsonNTVtype,

             else if JsonNTVvalue is not a JsonArray and not a
             JsonObject, JsonSepType is empty,

             else JsonSepType is identical to singleSep.

   For NTVlist entities:

      REQ6:  If NTVtype is a DataType, listSep is present in JsonSepType

             else listSep is not present.

3.3.  JsonNTVtype

   The JSON representation of a NTVtype (JsonNTVtype) is a compact
   representation of the NTVtype in the context of the NTVtypeParent.

THOMY                   Expires 28 November 2024               [Page 13]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   The JsonNTVtype is defined in Figure 5, which uses ABNF from
   [RFC5234].

   ; JSON representation of NTVType (JsonNTVtype)

   JsonNTVtype = [ NTVtypeLongName / NTVtypeRelativeName ]
       ; REQ7

   NTVtypeLongName = DataTypeLongName / NamespaceLongName
   NTVtypeRelativeName = *NamespaceName (DataTypeName / NamespaceName)
       ; REQ7

                        Figure 5: JsonNTVtype - ABNF

   The corresponding rules are as follows:

      REQ7:  if NTVtype is identical to NTVtypeParent, JsonNTVtype is
             empty,

             else if NTVtypeParent is a Namespace and if NTVtype is
             including in NTVtypeParent, JsonNTVtype is the
             NTVtypeRelativeName (relative to the NTVtypeParent),

             else JsonNTVtype is the NTVtypeLongName

   _Example:_

      _If "fr." is the name of a Namespace attached to the global
      Namespace and containing the DataType 'dep', then:_

      -  _{ "::fr." : { "department1:dep": "name1", "department2:dep":
         "name2" } } is a valid JsonNTV representation._

3.4.  JsonNTVvalue

   The JsonNTVvalue is the JsonValue representation of NTVvalue as
   defined in Figure 6, which uses ABNF from [RFC5234].

THOMY                   Expires 28 November 2024               [Page 14]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   ; JSON representation of NTVvalue (JsonNTVvalue)

   JsonNTVvalue       = JsonNTVsingleValue / JsonNTVlistValue

   JsonNTVsingleValue = NTVsingleValue
   JsonNTVlistValue   = JsonNTVarrayValue / JsonNTVobjectValue
       ; REQ8 REQ9

   JsonNTVarrayValue  = beginArray ListJsonNTVvalue endArray
   ListJsonNTVvalue   = [JsonNTV  *( vSep JsonNTV )]
   JsonNTVobjectValue = beginObject ListJsonNTVmember endObject
   ListJsonNTVmember  = [JsonNTVMember *( vSep JsonNTVMember)]

   NTVsingleValue     = JsonValue

                       Figure 6: JsonNTVvalue - ABNF

   For a NTVsingle, JsonNTVvalue is the NTVvalue.

   For a NTVlist, JsonNTValue has two representations:

   *  a JsonArray where JsonElements are the JsonNTV of included NTV
      entities,

   *  a JsonObject where the JsonMembers are the JsonMembers of the
      JsonNTV of included NTV entities.

   The corresponding rules are as follows:

      REQ8:  NTVlist with multiple NTV entities : if all JsonNTVname of
             NTV entities are different and not empty,
             JsonNTVobjectValue is used else JsonNTVarrayValue is used

      REQ9:  NTVlist with single NTV entity : if JsonNTVname of the
             NTVlist is not empty JsonNTVobjectValue is used else
             JsonNTVarrayValue is used

   _Example:_

      _{ ":point" : [2.3522, 48.8566], ":point" : [4.8357, 45.7640] } is
      not a valid JsonNTV_

4.  Examples

   Examples of JsonNTV representation of NTV entities:

   *Vsingle :*

THOMY                   Expires 28 November 2024               [Page 15]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

      _"lyon"_

      _52.5_

      _{ ":" : [4.8357, 45.7640] }_

   *NVsingle :*

      _{ "city" : "paris" }_

      _{ "paris:" : [4.8357, 45.7640] }_

   *TVsingle:*

      _{ ":point" : [4.8357, 45.7640] }_

      _{ ":string[fr]" : "Paris est un belle ville" }_

   *NTVsingle:*

      _{ "paris:point" : [2.3522, 48.8566] }_

      _{ "paris:ntv" : { "coordinate:point" : [4.8357, 45.7640] } }_

   *Vlist (composed with JsonArray):*

      _[4, 45]_

      _["paris"]_

      _[ [2.3522, 48.8566], {"lyon" : [4.8357, 45.7640]} ]_

      _[ { ":point" : [2.3522, 48.8566]}, {":point" : [4.8357, 45.7640]}
      ]_

      _[]_

   *Vlist (composed with JsonObject) :*

      _{ "name": "white", "firstname":"walter", "surname":"heisenberg"
      }_

      _{ "paris:point" : [2.3522, 48.8566] , "lyon" : "france"}_

      _{ "paris" : [2.3522, 48.8566], "" : [4.8357, 45.7640]}_

      _{ }_

THOMY                   Expires 28 November 2024               [Page 16]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   *NVlist :*

      _{ "simple list": [4, 45.7]}_

      _{ "cities": [{":point": [2.3522, 48.8566]}, {":point": [4.8357,
      45.7640]}]}_

   *TVlist :*

      _{ "::point": [[2.3522, 48.8566], {"lyon" : [4.8357, 45.7640]} ]
      }_

      _{ "::dat": [ "2022-01-28T18-23-54Z", "2022-01-28", 1234.78 ] }_

   *NTVlist :*

      _{ "cities::point": [[2.3522, 48.8566], {"lyon": [4.8357,
      45.7640]}] }_

      _{ "generic date::dat": [ "2022-01-28T18-23-54Z", "2022-01-28",
      1234.78]}_

      _{ "various::point": [ [2.3, 48.8], { ":date": "2022-01-28"},
      {":json": 25 }, { "another NTVlist::json": [1,2,3]} ]}_

   *NTVlist and NVlist (composed with JsonObject) :*

      _{ "cities::point": { "paris": [2.352, 48.856], "lyon": [4.835,
      45.764]}}_

      _{ "cities": {"paris:point": [2.3522, 48.8566] , "lyon":
      "france"}}_

5.  Parsing a JsonValue

   JsonValue is parsed according to JSON structure (from root to
   leaves).

   Several steps are considered:

   *  JSON decoding

   *  NTV entity decoding

   *  NTVvalue decoding

   *  NTVtype decoding

THOMY                   Expires 28 November 2024               [Page 17]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

5.1.  JSON decoding

   This part is not detailed and consists of:

   *  exploit the JSON structure to identify JsonNTVname and
      JsonNTVvalue,

   *  extract the following data from the JsonNTVname string:
      JsonNTVtype, NTVname and singleSep or listSep

5.2.  NTV entity decoding

   The NTV entity is inferred from the JSON structure of JsonValue or
   JsonNTVvalue:

      PARS1:  The tables Table 1 and Table 2 define the entity
              identification rules (NTVsingle or NTVlist)

   +===============+=============+
   | JsonValue     | NTV entity  |
   +===============+=============+
   | JsonPrimitive | Vsingle     |
   +---------------+-------------+
   | JsonUnnamed   | Vlist       |
   +---------------+-------------+
   | JsonArray     | Vlist       |
   +---------------+-------------+
   | JsonNamed     | see Table 2 |
   +---------------+-------------+

     Table 1: Decoding JsonValue

THOMY                   Expires 28 November 2024               [Page 18]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   +===========+===============+=============================+
   | Separator | JsonNTVvalue  | NTV entity                  |
   +===========+===============+=============================+
   | None      | JsonPrimitive | NVsingle                    |
   +-----------+---------------+-----------------------------+
   | None      | JsonNamed     | NVsingle                    |
   +-----------+---------------+-----------------------------+
   | None      | JsonUnnamed   | NVlist                      |
   +-----------+---------------+-----------------------------+
   | None      | JsonArray     | NVlist                      |
   +-----------+---------------+-----------------------------+
   | ":"       | JsonValue     | TVsingle or NTVSingle       |
   +-----------+---------------+-----------------------------+
   | "::"      | JsonUnnamed   | NVlist or TVlist or NTVlist |
   +-----------+---------------+-----------------------------+
   | "::"      | JsonArray     | NVlist or TVlist or NTVlist |
   +-----------+---------------+-----------------------------+

                  Table 2: Decoding JsonNTVvalue

5.3.  NTVvalue decoding

   The NTVvalue is inferred from the JsonNTVvalue:

      PARS2:  The NTVvalue of NTVsingle is the JsonNTVvalue.

      PARS3:  The NTVvalue of NTVlist is the list of NTV entities parsed
              for each JsonElement or JsonMember including in the
              JsonNTVvalue.

5.4.  NTVtype decoding

   NTVtype is inferred from the JsonNTVtype:

      PARS4:  If JsonNTVtype is a valid NTVtypeLongName : NTVtype is the
              decoded JsonNTVtype,

              else if concatened ParentNTVtypeLongName with JsonNTVtype
              is empty : NTVtype is "json",

              else if the decoded of concatenation of
              ParentNTVtypeLongName with JsonNTVtype is a valid
              NTVtypeLongName : NTVtype is it,

              else NTVtype is the defaultNTVtype

   The [JSON-NTV] repository gives some examples of NTV usage.

THOMY                   Expires 28 November 2024               [Page 19]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

6.  Properties

6.1.  NTV tree

   An NTV entity is a tree where the leaf nodes are the NTVsingle
   entities and where the inner nodes are the NTVlist entities.

   Therefore the tree property are applicable:

   *  tree indicators can be calculate:

      -  breadth : number of NTVsingle entities (leaves)

      -  size : number of NTV entities (nodes)

      -  height : length of the longest downward path to a leaf

   *  An ordering list of nodes can be defined to explore the tree for
      example according to the DFS pre-ordering algorithm[DFS] (this
      order is the same as the order in a JsonValue ),

6.2.  NTV Pointer

   A NTV Pointer is a string syntax for identifying a specific NTV
   entity within a NTV tree.

   The syntax defined for JSON Pointer [RFC6901] (json-pointer,
   reference-token) is transposable to NTV Pointer (ntv-pointer,
   reference-token):

   *  The ntv-pointer is a Unicode string containing a sequence of zero
      or more reference-tokens, each prefixed by a '/'.

   *  The reference-token is the NTVname if it exists otherwise the
      zero-based index of the NTV entity in the NTVvalue list.

   The ntv-pointer is equal to the json-pointer of the JsonNTV
   representation in most cases except :

   *  if the JsonNTV is a JsonObject with a single member where the
      value is a JsonPrimitive,

   *  - if the JsonNTV contains a JsonArray containing a JsonObject with
      a single member where the value is a JsonPrimitive

THOMY                   Expires 28 November 2024               [Page 20]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

6.3.  NTV Comparison

   Three levels of equality are defined.

   *Strict equality:*

      Two NTV entities are strictly equals if :

      -  the NTVname are identical

      -  the NTVtypes are identical

      -  the NTVvalue are identical

         o  if the NTVvalue is a list of NTV entities, each NTV entity
            has to be identical

         o  if the NTVvalue is a JSONvalue, the JSONvalues have to be
            identical

   *Structural equality:*

      Two NTV entities are structurally equals if :

      -  the NTVname are identical

      -  the NTVtypes of NTVsingle are identical

      -  the NTVvalue are structurally identical:

         o  if the NTVvalue is a list of NTV entities, each NTV entity
            has to be structurally identical

         o  if the NTVvalue is a JSONvalue, the JSONvalues have to be
            identical

      _Example of structural equality (JsonNTV representation):_

         _{"::int32": [10, 20] } and [{":int32": 10}, {":int32": 20}]_

   *Semantic equality:*

      Two NTV entities are semantically equals if :

      -  the NTVname are identical

      -  the NTVvalue are semantically identical:

THOMY                   Expires 28 November 2024               [Page 21]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

         o  if the NTVvalue is a list of NTV entities, each NTV entity
            has to be semantically identical

         o  if the NTVvalue is a JSONvalue, the native entity associated
            to the JSONvalue have to be identical

      _Example of semantic equality (JsonNTV representation):_

         _{":datetime": "2011-11-04T10:05:23+00:00" } and {":datetime":
         "2011-11-04T11:05:23+01:00"}_

6.4.  NTV Canonical

   The NTVtype of the NTVlist entities is only useful for constructing
   the JSON representation (two NTVlists with two different NTVtypes are
   equal according to the structural equality criteria).

   A canonical (single) format is chosen to facilitate sharing and
   analysis of NTV and JsonNTV data.  It is defined by setting a value
   for the NTVtype of an NTVlist entity.

   The rule is as follows:

      REQ10: NTVtype is empty, if an included entity is an NTVlist with
             an empty NTVtype,

             NTVtype is empty, if all included entities have an NTVtype
             'json',

             NTVtype is the common Namespace, if the common Namespace is
             not the GlobalNamespace,

             In other cases, the NTVtype is the same as that of the
             first included entity.

   This rule is simple to implement and allows you to have a compact
   JsonNTV format (another more complex choice would have been to take
   the most frequent NTVtype among the included entities).

6.5.  JSON as a subtype of NTV

   The Appendix C shows that there is an equivalence between Json
   entities (JsonArray, JsonObject, JsonNumber, JsonString, JsonFalse,
   JsonTrue or JsonNull) and the corresponding NTV entities called JNTV
   (resp.  NTVarray, NTVobject, NTVnumber, NTVstring, NTVfalse, NTVtrue
   , NTVnull).

   JNTV entities have several properties:

THOMY                   Expires 28 November 2024               [Page 22]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   *  JNTV and JSON structures are substitutable with respect to
      functions associated with Json structures (e.g. generation of the
      JsonText format),

   *  Strict equality or Structural equality between two JNTV entities
      are equivalent to equality between JsonNTV representations

   *  JNTV are canonical NTV entity

   *  NTV Pointer of JNTV are identical to Json Pointer of JsonNTV
      representations

6.6.  extended NTV structure

   The NTVvalue of NTV entities are JsonValue.  In the extended NTV
   structure, NTVvalue can be every kind of data.

   With this structure, the NTV representation is a "json like" data
   where:

   *  JsonNTVvalue is always NTVvalue,

   *  JsonNTVtype is optional (if NTVtype can be deduced from the
      NTVvalue),

   *  JsonNTVname is optional (if NTVname can be deduced from the
      NTVvalue).

   _Examples of extended NTV representation:_

      _{ "python date" : [ datetime.date(2022, 1, 18),
         datetime.date(2023, 1, 12) ] }_

      _this "json like" structure can be converted in JsonNTV format:_

      _{ "python date::date" : [ "2022-01-18", "2023-01-12" ] }_

6.7.  nested NTVsingle entities

   As defined in Section 2.2.1 an entity with Json representation can be
   taken into account.

   Appendix A defines usual NTVtypes (e.g. date, coordinate, email) but
   also NTVtypes associated to structured data (e.g. dataset, NTV data,
   custom format):

   The example in Figure 7 is the representation of a NTVlist with three
   NTVsingle:

THOMY                   Expires 28 November 2024               [Page 23]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   *  "dataset" is a NTVsingle build with a 'tab' structure (NTVdataset
      defined in [NTV-TAB]).  This NTVdataset includes in 'field2' an
      NTV structure,

   *  "ntvdata" is a NTVsingle build with a 'ntv' structure.  This
      structure includes an other NTV structure,

   *  "sensor" is a NTVsingle build with a custom structure.  This
      structure includes a NTVdataset.

   ex_list = {
     "structure": {
       "dataset:tab":{
         "field1": [1,2,3],
         "field2": [4,5,{":ntv": {"min": 6, "max": 7}]
       },
       "ntvdata:ntv":{
         "equinox:date": "2024-03-20",
         "paris:point": [2.35, 48.85],
         "other data:ntv": {"val1": 1, "val2": 2}
       },
       "sensor:$sensor": [
         8.51, 3.5, 4.2,
         {":tab": [[1,2,3,4], [5,6,7,8]]}
       ]
     }
   }

                         Figure 7: Nested NTVsingle

   Nested NTVsingle is treated as simple NTVsingle and can be used with
   extended NTV structures.

7.  IANA Considerations

   No IANA actions are required :

      Any JsonValue is a JsonNTVValue and conversely, any JsonNTVvalue
      is a JsonValue.

      Thus, any JSON data may or may not be treated as JsonNTV data, so
      there is no need to create a specific MIME media type for JsonNTV.

      All properties of the MIME media type "application/json" are
      applicable.

THOMY                   Expires 28 November 2024               [Page 24]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

8.  Security Considerations

   The format used for NTV data exchanges is the JSON format.  So, all
   the security considerations of [RFC8259] apply.

   The NTV structure provides no cryptographic integrity protection of
   any kind.

9.  References

9.1.  Normative References

   [RFC4648]  Josefsson, S., "The Base16, Base32, and Base64 Data
              Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
              <https://www.rfc-editor.org/info/rfc4648>.

   [RFC7946]  Butler, H., Daly, M., Doyle, A., Gillies, S., Hagen, S.,
              and T. Schaub, "The GeoJSON Format", RFC 7946,
              DOI 10.17487/RFC7946, August 2016,
              <https://www.rfc-editor.org/info/rfc7946>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/info/rfc8174>.

   [RFC5234]  Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
              Specifications: ABNF", STD 68, RFC 5234,
              DOI 10.17487/RFC5234, January 2008,
              <https://www.rfc-editor.org/info/rfc5234>.

   [RFC6901]  Bryan, P., Ed., Zyp, K., and M. Nottingham, Ed.,
              "JavaScript Object Notation (JSON) Pointer", RFC 6901,
              DOI 10.17487/RFC6901, April 2013,
              <https://www.rfc-editor.org/info/rfc6901>.

   [RFC8259]  Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
              Interchange Format", STD 90, RFC 8259,
              DOI 10.17487/RFC8259, December 2017,
              <https://www.rfc-editor.org/info/rfc8259>.

   [RFC3339]  Klyne, G. and C. Newman, "Date and Time on the Internet:
              Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002,
              <https://www.rfc-editor.org/info/rfc3339>.

THOMY                   Expires 28 November 2024               [Page 25]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   [RFC7950]  Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
              RFC 7950, DOI 10.17487/RFC7950, August 2016,
              <https://www.rfc-editor.org/info/rfc7950>.

9.2.  Informative References

   [DFS]      "Wikipedia", "Depth-first search algorithm",
              <https://en.wikipedia.org/wiki/Depth-first_search>.

   [NTV-TAB]  Thomy, P., "NTV tabular format (NTV-TAB)", 2023,
              <https://datatracker.ietf.org/doc/draft-thomy-ntv-tab/>.

   [JSON-ND]  Kleidon, G., "JSON-ND", 2020,
              <https://github.com/glenkleidon/JSON-ND>.

   [JSON-NTV] Thomy, P., "JSON-NTV", 2022,
              <https://github.com/loco-philippe/NTV#readme>.

   [OLC]      "Google", "Open Location Code", 2016,
              <https://github.com/google/open-location-code>.

   [W3C_TAB]  "W3C", "Recommendation : Model for Tabular Data and
              Metadata on the Web", 17 December 2015,
              <https://www.w3.org/TR/2015/REC-tabular-data-model-
              20151217/>.

   [ISO_3166-1_alpha-2]
              "ISO", "Codes for the representation of names of countries
              and their subdivisions - Part 1: Country code", 2020,
              <https://www.iso.org/standard/72482.html>.

   [TABLE_SCHEMA]
              "Frictionless", "Table Schema specification", 5 October
              2021, <https://specs.frictionlessdata.io/table-
              schema/#types-and-formats>.

   [JSON_SCHEMA]
              "JSON Schema", "JSON Schema validation", 16 June 2022,
              <https://json-schema.org/draft/2020-12/json-schema-
              validation>.

Appendix A.  Global DataType and Namespace

   The structure of DataType by Namespace makes it possible to have
   DataType or Namespace corresponding to recognized standards at the
   global level.

THOMY                   Expires 28 November 2024               [Page 26]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   A standard DataType / Namespace is a DataType / Namespace defined in
   the Global Namespace.

   The standard DataType and Namespace are listed below.

A.1.  Json

   Json DataType have a generic DataType : "json"

   +========================+=======================+==================+
   | DataTypeName (generic) | NTVvalue              | example NTVvalue |
   +========================+=======================+==================+
   | json                   | generic DataType      |                  |
   +------------------------+-----------------------+------------------+
   | number (json)          | JsonNumber [RFC8259]  | 10               |
   +------------------------+-----------------------+------------------+
   | boolean (json)         | JsonBoolean           | "true"           |
   |                        | [RFC8259]             |                  |
   +------------------------+-----------------------+------------------+
   | null (json)            | JsonNull [RFC8259]    | "null"           |
   +------------------------+-----------------------+------------------+
   | string (json)          | JsonString [RFC8259]  | "value"          |
   +------------------------+-----------------------+------------------+
   | array (json)           | JsonArray [RFC8259]   | [1.1, 2.2]       |
   +------------------------+-----------------------+------------------+
   | object (json)          | JsonObject [RFC8259]  | {"value1": 1,    |
   |                        |                       | "value2": 2}     |
   +------------------------+-----------------------+------------------+

                           Table 3: Json DataType

A.2.  Numbers

   +===========================+======================+================+
   | DataTypeName              | NTVvalue             | comment        |
   +===========================+======================+================+
   | int                       | JsonNumber [RFC8259] | integer        |
   +---------------------------+----------------------+----------------+
   | int8, int16,              | JsonNumber [RFC8259] | signed integer |
   | int32, int64              |                      |                |
   +---------------------------+----------------------+----------------+
   | uint8, uint16,            | JsonNumber [RFC8259] | unsigned       |
   | uint32, uint64            |                      | integer        |
   +---------------------------+----------------------+----------------+
   | decimal64                 | JsonNumber [RFC8259] | decimal        |
   |                           |                      | floating point |
   +---------------------------+----------------------+----------------+
   | float                     | JsonNumber [RFC8259] | binary         |

THOMY                   Expires 28 November 2024               [Page 27]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   |                           |                      | floating point |
   +---------------------------+----------------------+----------------+
   | float16,                  | JsonNumber [RFC8259] | binary         |
   | float32, float64          |                      | floating point |
   +---------------------------+----------------------+----------------+

                         Table 4: Numbers DataType

A.3.  Binary encoding

   +==============+===========================+========================+
   | DataTypeName | NTVvalue                  | comment                |
   +==============+===========================+========================+
   | bit          | binary digit              | string "0" or "1"      |
   +--------------+---------------------------+------------------------+
   | binary       | bit string                | string of bit array    |
   +--------------+---------------------------+------------------------+
   | base16       | base16 encoding           | string of hexadecimal  |
   |              | [RFC4648]                 | array                  |
   +--------------+---------------------------+------------------------+
   | base32       | base32 encoding           | string of              |
   |              | [RFC4648]                 | duotrigesimal array    |
   +--------------+---------------------------+------------------------+
   | base64       | base64 encoding           | string of              |
   |              | [RFC4648]                 | tetrasexagesimal array |
   +--------------+---------------------------+------------------------+

                          Table 5: Binary DataType

A.4.  Datation

   Datation DataType have a generic DataType : "dat"

THOMY                   Expires 28 November 2024               [Page 28]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   +============+========================+============================+
   |DataTypeName|NTVvalue                | example NTVvalue           |
   |(generic)   |                        |                            |
   +============+========================+============================+
   |year        |fullyear [RFC3339]      | 1998                       |
   +------------+------------------------+----------------------------+
   |month       |month [RFC3339]         | 10                         |
   +------------+------------------------+----------------------------+
   |yearmonth   |year + month (ISO8601-1)| 1998-10                    |
   +------------+------------------------+----------------------------+
   |day         |mday [RFC3339] day of   | 21                         |
   |            |month                   |                            |
   +------------+------------------------+----------------------------+
   |wday        |wday [RFC3339] day of   | 7                          |
   |            |week                    |                            |
   +------------+------------------------+----------------------------+
   |yday        |yday [RFC3339] day of   | 360                        |
   |            |year                    |                            |
   +------------+------------------------+----------------------------+
   |week        |week [RFC3339]          | 38                         |
   +------------+------------------------+----------------------------+
   |hour        |hour [RFC3339]          | 20                         |
   +------------+------------------------+----------------------------+
   |minute      |minute [RFC3339]        | 18                         |
   +------------+------------------------+----------------------------+
   |second      |second [RFC3339]        | 54                         |
   +------------+------------------------+----------------------------+
   |dat         |generic DataType        |                            |
   +------------+------------------------+----------------------------+
   |date (dat)  |date [RFC3339]          | "2022-01-28""              |
   +------------+------------------------+----------------------------+
   |time (dat)  |timespec-base [time-    | "T18:23:54", "18:23",      |
   |            |fraction][RFC3339]      | "T18"                      |
   +------------+------------------------+----------------------------+
   |timetz (dat)|timespec-base [time-    | "T18:23:54+0400"           |
   |            |fraction] time-         |                            |
   |            |zone[RFC3339]           |                            |
   +------------+------------------------+----------------------------+
   |datetime    |iso-date-time (without  | "2022-01-28T18-23-54"      |
   |(dat)       |time-zone)[RFC3339]     |                            |
   +------------+------------------------+----------------------------+
   |datetimetz  |iso-date-time (with     | "2022-01-28T18-23-54+0400" |
   |(dat)       |time-zone)[RFC3339]     |                            |
   +------------+------------------------+----------------------------+

                        Table 6: Datation DataType

THOMY                   Expires 28 November 2024               [Page 29]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

A.5.  Period and Duration

   +==============+===========+======================================+
   | DataTypeName | NTVvalue  | example NTVvalue                     |
   +==============+===========+======================================+
   | duration     | duration  | "P3Y6M4DT12H30M5S"                   |
   |              | [RFC3339] |                                      |
   +--------------+-----------+--------------------------------------+
   | timearray    | JsonArray | [dat1, dat2]                         |
   |              |           |                                      |
   |              |           | _dat1, dat2 have "dat" DataTypeName_ |
   +--------------+-----------+--------------------------------------+
   | period       | period    | "2022-01-01 / 2022-01-30"            |
   |              | [RFC3339] |                                      |
   |              |           | "2022-01-01 / P3Y6M4DT12H30M5S"      |
   +--------------+-----------+--------------------------------------+

                  Table 7: Period and Duration DataType

A.6.  Location

   Location DataType have a generic DataType : "loc".

   The CRS (Coordinate Reference Systems) is geographic, using the World
   Geodetic System 1984 (WGS 84) datum, with longitude and latitude
   units of decimal degrees (EPSG:4326).

   +===============+=================+=================================+
   | DataTypeName  | NTVvalue        | example NTVvalue                |
   | (generic)     |                 |                                 |
   +===============+=================+=================================+
   | loc           | generic         |                                 |
   |               | DataType        |                                 |
   +---------------+-----------------+---------------------------------+
   | point (loc)   | Point           | [ 5.12, 45.256 ] _(lon,         |
   |               | coordinates     | lat)_                           |
   |               | [RFC7946]       |                                 |
   +---------------+-----------------+---------------------------------+
   | pointstr      | Point           | "5.12, 45.256" _(lon,           |
   | (loc)         | coordinates     | lat)_                           |
   |               | (string)        |                                 |
   +---------------+-----------------+---------------------------------+
   | pointobj      | Point           | {"lon": 5.12, "lat":            |
   | (loc)         | coordinates     | 45.256}                         |
   |               | (object)        |                                 |
   +---------------+-----------------+---------------------------------+
   | multipoint    | MultiPoint      | [pt1, pt2, pt3]                 |
   |               | coordinates     |                                 |

THOMY                   Expires 28 November 2024               [Page 30]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   |               | [RFC7946]       | _ptx is "point" NTVvalue_       |
   +---------------+-----------------+---------------------------------+
   | line (loc)    | LineString      | [pt1, pt2, pt3]                 |
   |               | coordinates     |                                 |
   |               | [RFC7946]       | _ptx is "point" NTVvalue_       |
   +---------------+-----------------+---------------------------------+
   | multiline     | MultiLineString | [li1, li2, li3]                 |
   |               | coordinates     |                                 |
   |               | [RFC7946]       | _lix is "line" NTVvalue_        |
   +---------------+-----------------+---------------------------------+
   | polygon (loc) | Polygon         | [rg1, rg2, rg3]                 |
   |               | coordinates     |                                 |
   |               | [RFC7946]       | _rgx is "line" NTVvalue         |
   |               |                 | (ring)_                         |
   +---------------+-----------------+---------------------------------+
   | multipolygon  | MultiPolygon    | [pl1, pl2, pl3]                 |
   | (loc)         | coordinates     |                                 |
   |               | [RFC7946]       | _plx is "polygon"               |
   |               |                 | NTVvalue_                       |
   +---------------+-----------------+---------------------------------+
   | geometry      | Geometry        | "point", "line" or              |
   |               | coordinates     | "polygon"                       |
   |               | [RFC7946]       |                                 |
   |               |                 | NTVvalue                        |
   +---------------+-----------------+---------------------------------+
   | multigeometry | MultiGeometry   | [geo1, geo2, geo3]              |
   |               | coordinates     |                                 |
   |               | [RFC7946]       | _geox is "geometry"             |
   |               |                 | NTVvalue_                       |
   +---------------+-----------------+---------------------------------+
   | box (loc)     | box coordinates | [ -10.0, -10.0, 10.0,           |
   |               | [RFC7946]       | 10.0 ]                          |
   +---------------+-----------------+---------------------------------+
   | geojson (loc) | geoJSON object  | {"type": "point",               |
   |               | [RFC7946]       | "coordinates": [40.0,           |
   |               |                 | 0.0]}                           |
   +---------------+-----------------+---------------------------------+
   | codeolc (loc) | Open Location   | "8FW4V75V+8F6"                  |
   |               | Code [OLC]      |                                 |
   +---------------+-----------------+---------------------------------+

                         Table 8: Location DataType

THOMY                   Expires 28 November 2024               [Page 31]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

A.7.  Structured data

   +==============+=============================================+
   | DataTypeName | NTVvalue                                    |
   +==============+=============================================+
   | row          | row [W3C_TAB]                               |
   +--------------+---------------------------------------------+
   | field        | column [W3C_TAB]                            |
   +--------------+---------------------------------------------+
   | tab          | table [NTV-TAB]                             |
   +--------------+---------------------------------------------+
   | ndarray      | multidimensional array [NTV-TAB]            |
   +--------------+---------------------------------------------+
   | xndarray     | labelled multidimensional array[NTV-TAB]    |
   +--------------+---------------------------------------------+
   | xdataset     | coordinated multidimensional array[NTV-TAB] |
   +--------------+---------------------------------------------+
   | ntv          | JsonNTV                                     |
   +--------------+---------------------------------------------+
   | sch          | Schema                                      |
   +--------------+---------------------------------------------+

                    Table 9: Structured DataType

   The data structure associated to this DataTypeName are defined in
   specific document.

A.8.  Normalized String

   +============+=================+===================================+
   |DataTypeName|NTVvalue         | example NTVvalue                  |
   +============+=================+===================================+
   |unit        |Physical         | "kg / s2"                         |
   |            |quantities       |                                   |
   +------------+-----------------+-----------------------------------+
   |uri         |URI (RFC3986)    | "https://www.ietf.org/rfc/        |
   |            |                 | rfc3986.txt"                      |
   |            |                 |                                   |
   |            |                 | "geo:13.4125,103.86673" (RFC5870) |
   |            |                 |                                   |
   |            |                 | "info:eu-repo/dai/nl/12345"       |
   |            |                 |                                   |
   |            |                 | "mailto:John.Doe@example.com"     |
   |            |                 |                                   |
   |            |                 | "tel:+1-201-555-0123" (RFC3966)   |
   +------------+-----------------+-----------------------------------+
   |uriref      |URI-reference    | "www.example.com/questions/3456/  |
   |            |(RFC3986)        | my-document"                      |

THOMY                   Expires 28 November 2024               [Page 32]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   +------------+-----------------+-----------------------------------+
   |iri         |internationalized| "http://www.example.org/D%FCrst"  |
   |            |URI (RFC3987)    |                                   |
   +------------+-----------------+-----------------------------------+
   |iriref      |IRI-reference    | "www.example.org/D%FCrst"         |
   |            |(RFC3987)        |                                   |
   +------------+-----------------+-----------------------------------+
   |uritem      |URI-template     | "{+x,hello,y}"                    |
   |            |(RFC6570)        |                                   |
   +------------+-----------------+-----------------------------------+
   |uuid        |UUID (RFC4122)   | "f81d4fae-7dec-                   |
   |            |                 | 11d0-a765-00a0c91e6bf6"           |
   +------------+-----------------+-----------------------------------+
   |email       |address (RFC5322)| "John Doe <jdoe@machine.example>" |
   +------------+-----------------+-----------------------------------+
   |idnemail    |internationalized|                                   |
   |            |adress (RFC6531) |                                   |
   +------------+-----------------+-----------------------------------+
   |hostname    |Host Names       | "en.wikipedia.org"                |
   |            |(RFC1123)        |                                   |
   +------------+-----------------+-----------------------------------+
   |idnhostname |internationalized|                                   |
   |            |Host Names       |                                   |
   |            |(RFC5890)        |                                   |
   +------------+-----------------+-----------------------------------+
   |jpointer    |JSON pointer     | "/foo/0"                          |
   |            |(RFC6901)        |                                   |
   +------------+-----------------+-----------------------------------+
   |rjpointer   |relative JSON    | "1/nested/objects"                |
   |            |pointer (I-D)    |                                   |
   +------------+-----------------+-----------------------------------+
   |regex       |regular          | "[Ss]mith\\\\b"                   |
   |            |expression (ECMA |                                   |
   |            |262)             |                                   |
   +------------+-----------------+-----------------------------------+
   |ipv4        |IPv4 address     | "192.168.1.1"                     |
   |            |(RFC2673)        |                                   |
   +------------+-----------------+-----------------------------------+
   |ipv6        |IPv6 address     | "2001:0db8:85a3:0000:00           |
   |            |(RFC2373)        |                                   |
   |            |                 | 00:8a2e:0370:7334"                |
   +------------+-----------------+-----------------------------------+
   |file        |file-hier-part   | "///path/to/file"                 |
   |            |(RFC8089)        |                                   |
   |            |                 | "//host.example.com/path/to/file" |
   +------------+-----------------+-----------------------------------+

                      Table 10: Structured DataType

THOMY                   Expires 28 November 2024               [Page 33]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   Keywords are not defined as Normalized String (eg. "id", "mandatory",
   "units"), they can be used as custom DataType (eg. "$id",
   "$mandatory", "$units")

A.9.  Namespace

   The global Namespace includes Namespaces for countries, dependent
   territories and special areas as defined in [ISO_3166-1_alpha-2]

   The JsonNamespace for those Namespace is composed by the two digits
   of the country following by a dot.

   _Example :_

      _"fr." is the France JsonNamespace_

      _"un." is The United Nations JsonNamespace_

   Each Namespace defines a list of included DataType and Namespace.

A.10.  Custom DataType and Namespace

   Custom DataType and Namespace can be created in any Namespace.

   Table 11 below presents some examples of custom DataType.

THOMY                   Expires 28 November 2024               [Page 34]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   +================+=========================================+
   | JsonDataType   | comment or JsonNTV example              |
   +================+=========================================+
   | "$id"          | defined in the global Namespace         |
   |                |                                         |
   |                | eg. { ":$id": 5426849" }                |
   +----------------+-----------------------------------------+
   | "$iata"        | IATA airport code                       |
   |                |                                         |
   |                | eg. {"Paris Nord:$iata": "CDG"}         |
   +----------------+-----------------------------------------+
   | "$uic.station" | UIC station code                        |
   |                |                                         |
   |                | eg. {"Nantes station:$uic.station" :    |
   |                | "8748100"}                              |
   +----------------+-----------------------------------------+
   | "fr.$city"     | DataType "city" in "fr."  Namespace     |
   |                |                                         |
   |                | eg. {":fr.$city" : "Paris"}             |
   +----------------+-----------------------------------------+
   | "$schemaorg."  | "schemaorg" catalog                     |
   |                |                                         |
   |                | eg. { ":$schemaorg.propertyID": "NO2" } |
   |                |                                         |
   |                | { ":$schemaorg.unitText": "mg/m3"}      |
   +----------------+-----------------------------------------+
   | "$darwincore." | "darwincore" catalog                    |
   |                |                                         |
   |                | eg. { ":$darwincore.acceptedNameUsage": |
   |                | "Tamias minimus" }                      |
   +----------------+-----------------------------------------+

              Table 11: Examples of custom DataType

Appendix B.  Complete ABNF notation

   ; representation of DataType and Namespace (Name and LongName)

   DataTypeLongName  = NamespaceParentLongName DataTypeName

   NamespaceLongName = NamespaceParentLongName NamespaceName
   NamespaceParentLongName = NamespaceLongName

   NamespaceName   = [ ["$"] JsonString "." ]      ; REQ2 REQ3
   DataTypeName    = TypeBaseName ["[" TypeExtensionName "]"]
   TypeBaseName    = ["$"] JsonString              ; REQ3
   TypeExtensionName   = JsonString

THOMY                   Expires 28 November 2024               [Page 35]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   ; JSON representation of NTV entities (JsonNTV)

   JsonNTV        = JsonNTVnamed / JsonNTVsimple      ; REQ4

   JsonNTVnamed   = beginObject JsonNTVMember endObject
   JsonNTVsimple  = JsonNTVvalue

   JsonNTVMember  = JsonNTVname nSep JsonNTVvalue

   ; Extract of JSON grammar used in this document

   beginArray    = ws "[" ws
   beginObject   = ws "{" ws
   endArray      = ws "]" ws
   endObject     = ws "}" ws
   nSep          = ws ":" ws
   vSep          = ws "," ws
   ws = *( %x20 / %x09 / %x0A / %x0D )

   JsonValue  = JsonValue   ; indicates that rule is defined in RFC8259
   JsonString = JsonString  ; indicates that rule is defined in RFC8259

   ; JSON representation of NTVname and NTVtype (JsonNTVname)

   JsonNTVname = NTVname JsonSepType
   JsonSepType = [singleSep [JsonNTVtype]]/([listSep] JsonNTVtype)
       ; REQ5 REQ6

   NTVname = JsonString

   singleSep   = ":"      ; NTVsingle separator
   listSep     = "::"     ; NTVlist separator

   ; JSON representation of NTVType (JsonNTVtype)

   JsonNTVtype = [ NTVtypeLongName / NTVtypeRelativeName ]
       ; REQ7

   NTVtypeLongName = DataTypeLongName / NamespaceLongName
   NTVtypeRelativeName = *NamespaceName (DataTypeName / NamespaceName)
       ; REQ7

   ; JSON representation of NTVvalue (JsonNTVvalue)

   JsonNTVvalue       = JsonNTVsingleValue / JsonNTVlistValue

   JsonNTVsingleValue = NTVsingleValue
   JsonNTVlistValue   = JsonNTVarrayValue / JsonNTVobjectValue

THOMY                   Expires 28 November 2024               [Page 36]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

       ; REQ8 REQ9

   JsonNTVarrayValue  = beginArray ListJsonNTVvalue endArray
   ListJsonNTVvalue   = [JsonNTV  *( vSep JsonNTV )]
   JsonNTVobjectValue = beginObject ListJsonNTVmember endObject
   ListJsonNTVmember  = [JsonNTVMember *( vSep JsonNTVMember)]

   NTVsingleValue     = JsonValue

                      Figure 8: Collected ABNF grammar

Appendix C.  JSON-NTV equivalence

   This Appendix shows that we can associate with each JsonValue an NTV
   entity whose JSON representation (JsonNtv) is identical to the
   JsonValue.

   To do this, let's call NTVarray, NTVobject, NTVnumber, NTVstring,
   NTVfalse, NTVtrue, NTVnull the entities defined below.

   *  Json primitives

         An NTVprimitive entity (resp.  NTVnumber, NTVstring, NTVfalse,
         NTVtrue or NTVnull) is a Vsingle entity whose NTVvalue is a
         JsonPrimitive (resp.  JsonNumber, JsonString, JsonFalse,
         JsonTrue or JsonNull).

         For example, the NTVstring entity associated with the
         JsonString "foo" has the following attributes:

         o  NTVname: empty,

         o  NTVtype: "json",

         o  NTVvalue: "foo".

         Given the NTV rules, the JsonNtv is equal to the NTVvalue and
         therefore the JsonPrimitive.  Conversely, an NTV parser
         converts a JsonPrimitive into the corresponding NTVprimitive.

   *  Json Array

         The NTVarray entity is the Vlist entity composed of the NTV
         entities associated with the JsonElements of the JsonArray.

         For example, for a JsonArray composed of the JsonNumber
         represented by 25 and the JsonArray represented by [1,2], the
         NTVarray has the following attributes:

THOMY                   Expires 28 November 2024               [Page 37]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

         o  NTVname: None

         o  NTVtype: None

         o  NTVvalue: composed of NTVnumber 25 and the NTVarray
            corresponding to the JsonArray [1,2]

         As before, taking into account the NTV rules, the JsonNtv is
         equal to the json representation of the NTVvalue which is
         identical to the JsonArray.

         Conversely, an NTV parser converts a JsonArray into the
         corresponding NTVarray.

   *  JsonObject

         Let's call NTVmember the NTV entity associated with the
         JsonObject corresponding to a JsonMember (key/val).  This
         JsonObject has the representation {key: val}.

         If val is a Json Primitive, NTVmember is an NVsingle:

         o  NTVname:key

         o  NTVtype: "json"

         o  NTVvalue: val

         If val is a JsonArray or JsonObject, NTVmember is an NVlist:

         o  NTVname:key

         o  NTVtype: None

         o  NTVvalue: composed of NTV entities associated with the
            elements of the JsonArray (or members of the JsonObject)

         The NTVobject entity is the Vlist entity composed of the
         NTVmember entities associated with the JsonMembers of the
         JsonObject.

         For example, for a JsonObject composed of the JsonMember
         represented by "foo": 25 and the JsonMember represented by
         "bar": [1,2], the NTVObject will be:

         o  NTVname: None

         o  NTVtype: None

THOMY                   Expires 28 November 2024               [Page 38]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

         o  NTVvalue: composed of NVsingle (NTVname: "foo", NTVtype:
            "json", NTVvalue: 25) and NVlist (NTVname: "bar", NTVtype:
            None, NTVvalue: composed of NTVnumber 1 and NTVnumber 2).

         Similarly to the JsonArray, given the NTV rules, the JsonNtv is
         equal to the json representation of the NTVvalue which is
         identical to the JsonObject.

         Conversely, an NTV parser converts a JsonObject into the
         corresponding NTVObject.

   Thus, for all Json entities, we have an equivalence with an NTV
   entity

Appendix D.  Mapping DataTypes

   This Appendix presents the mapping between DataTypes and the types
   defined in Data schemas or Data languages.

D.1.  Table-Schema

   The mapping concerns Table Schema types and formats [TABLE_SCHEMA].
   Parsable and pattern formats (datation) and topojson (location) are
   not included

   +===========+====================================+==============+
   | type      | format                             | DataType     |
   +===========+====================================+==============+
   | string    | default                            | string       |
   +-----------+------------------------------------+--------------+
   | string    | email                              | email        |
   +-----------+------------------------------------+--------------+
   | string    | uri                                | uri          |
   +-----------+------------------------------------+--------------+
   | string    | binary (base64 string)             | base64       |
   +-----------+------------------------------------+--------------+
   | string    | uuid                               | uuid         |
   +-----------+------------------------------------+--------------+
   | number    | default                            | number       |
   +-----------+------------------------------------+--------------+
   | integer   | default                            | int          |
   +-----------+------------------------------------+--------------+
   | boolean   | default                            | boolean      |
   +-----------+------------------------------------+--------------+
   | object    | default (json)                     | json         |
   +-----------+------------------------------------+--------------+
   | array     | default (json array)               | array        |
   +-----------+------------------------------------+--------------+

THOMY                   Expires 28 November 2024               [Page 39]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   | date      | default (date ISO8601)             | date         |
   +-----------+------------------------------------+--------------+
   | time      | default (time ISO8601)             | time         |
   +-----------+------------------------------------+--------------+
   | datetime  | default (datetime ISO8601 in UTC)  | datetime     |
   +-----------+------------------------------------+--------------+
   | year      | default                            | year         |
   +-----------+------------------------------------+--------------+
   | yearmonth | default                            | yearmonth    |
   +-----------+------------------------------------+--------------+
   | duration  | default (lexical duration ISO8601) | duration     |
   +-----------+------------------------------------+--------------+
   | geopoint  | default (string "lon, lat")        | pointstr     |
   +-----------+------------------------------------+--------------+
   | geopoint  | array (array [lon, lat])           | point        |
   +-----------+------------------------------------+--------------+
   | geopoint  | object (eg {"lon": 90, "lat": 45}) | pointobj     |
   +-----------+------------------------------------+--------------+
   | geojson   | default (geojson spec)             | geojson      |
   +-----------+------------------------------------+--------------+
   | -any-     | -any-                              | $xxx (custom |
   |           |                                    | type)        |
   +-----------+------------------------------------+--------------+

                      Table 12: Table-Schema types

D.2.  JSON Schema

   The mapping concerns JSON-schema [JSON_SCHEMA] primitive types,
   defined formats and String-Encoded data .

   +=================+=======================+=============+
   | type            | format                | DataType    |
   +=================+=======================+=============+
   | string          |                       | string      |
   +-----------------+-----------------------+-------------+
   | string          | date-time             | datetime    |
   +-----------------+-----------------------+-------------+
   | string          | time                  | time        |
   +-----------------+-----------------------+-------------+
   | string          | date                  | date        |
   +-----------------+-----------------------+-------------+
   | string          | duration              | duration    |
   +-----------------+-----------------------+-------------+
   | string          | email                 | email       |
   +-----------------+-----------------------+-------------+
   | string          | idn-email             | idnemail    |
   +-----------------+-----------------------+-------------+

THOMY                   Expires 28 November 2024               [Page 40]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

   | string          | hostname              | hostname    |
   +-----------------+-----------------------+-------------+
   | string          | idn-hostname          | idnhostname |
   +-----------------+-----------------------+-------------+
   | string          | ipv4                  | ipv4        |
   +-----------------+-----------------------+-------------+
   | string          | ipv6                  | ipv6        |
   +-----------------+-----------------------+-------------+
   | string          | uuid                  | uuid        |
   +-----------------+-----------------------+-------------+
   | string          | uri                   | uri         |
   +-----------------+-----------------------+-------------+
   | string          | uri-reference         | uriref      |
   +-----------------+-----------------------+-------------+
   | string          | uri-template          | uritem      |
   +-----------------+-----------------------+-------------+
   | string          | iri                   | iri         |
   +-----------------+-----------------------+-------------+
   | string          | iri-reference         | iriref      |
   +-----------------+-----------------------+-------------+
   | string          | json-pointer          | jpointer    |
   +-----------------+-----------------------+-------------+
   | string          | relative-json-pointer | rjpointer   |
   +-----------------+-----------------------+-------------+
   | string          | regex                 | regex       |
   +-----------------+-----------------------+-------------+
   | number          |                       | number      |
   +-----------------+-----------------------+-------------+
   | integer         |                       | int         |
   +-----------------+-----------------------+-------------+
   | boolean         |                       | boolean     |
   +-----------------+-----------------------+-------------+
   | object          |                       | object      |
   +-----------------+-----------------------+-------------+
   | array           |                       | array       |
   +-----------------+-----------------------+-------------+
   | contentEncoding | base64                | base64      |
   +-----------------+-----------------------+-------------+
   | contentEncoding | base32                | base32      |
   +-----------------+-----------------------+-------------+
   | contentEncoding | base16                | base16      |
   +-----------------+-----------------------+-------------+
   | contentEncoding | binary                | binary      |
   +-----------------+-----------------------+-------------+
   | null            |                       | null        |
   +-----------------+-----------------------+-------------+

                  Table 13: JSON Schema types

THOMY                   Expires 28 November 2024               [Page 41]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

D.3.  YANG

   The mapping concerns YANG [RFC7950] build-in types defined.
   Enumeration, leafref, identityref, instance-identifier, union are not
   included.

   +===========+===========+==========+
   | type      | DataType  | comments |
   +===========+===========+==========+
   | boolean   | boolean   |          |
   +-----------+-----------+----------+
   | decimal64 | decimal64 |          |
   +-----------+-----------+----------+
   | empty     | null      |          |
   +-----------+-----------+----------+
   | int8      | int8      |          |
   +-----------+-----------+----------+
   | int16     | int16     |          |
   +-----------+-----------+----------+
   | int32     | int32     |          |
   +-----------+-----------+----------+
   | int64     | int64     |          |
   +-----------+-----------+----------+
   | uint8     | uint8     |          |
   +-----------+-----------+----------+
   | uint16    | uint16    |          |
   +-----------+-----------+----------+
   | uint32    | uint32    |          |
   +-----------+-----------+----------+
   | uint64    | uint64    |          |
   +-----------+-----------+----------+
   | string    | string    |          |
   +-----------+-----------+----------+
   | bit       | bit       |          |
   +-----------+-----------+----------+
   | binary    | binary    |          |
   +-----------+-----------+----------+

           Table 14: YANG types

Acknowledgements

   TBD

Contributors

   TBD

THOMY                   Expires 28 November 2024               [Page 42]
Internet-Draft       JSON semantic format (JSON-NTV)            May 2024

Author's Address

   Philippe THOMY
   Loco-labs
   476 chemin du gaf de Famian
   84 500 BOLLENE
   France
   Email: philippe@loco-labs.io
   URI:   https://github.com/loco-philippe/NTV/blob/main/README.md

THOMY                   Expires 28 November 2024               [Page 43]