Skip to main content

JSON-NTV (named and typed value) json-NTV : a semantic format for interoperability

JSON-NTV is a universal representation format. It allows the sharing and conversion of any type of data.

The NTV format is part of the Environmental Sensing Project

For more information, see the user guide or the github repository.

What is NTV ?

The semantic level of shared JSON (or CSV) data (e.g. Open Data) remains low, which makes automated reuse difficult.

JSON-NTV proposes to enrich it to obtain a real interoperable exchange format.

NTV format

The NTV format consists of representing data by three attributes: a name, a type and a value. This representation is common in programming languages (for example a variable with Python typing is defined by age: int = 25), however the JSON format represents data with only a value or a key:value pair.

The JSON-NTV extension consists of including the type in the name to associate it with a value (for example {'age:int': 25} is the JSON representation of the NTV triplet ('age', 'int' , 25 ) ).

This approach makes it possible to reversibly represent any simple or complex data by a JSON structure (high interoperability).

Examples

In [1]: from shapely.geometry import Point
        from datetime import date
        from pprint import pprint

In [2]: pprint(Ntv.obj(21).expand())
Out[2]: {'name': '', 'type': 'json', 'value': 21}

In [3]: pprint(Ntv.obj({"paris:point": [2.3, 48.9] }).expand())
Out[3]: {'name': 'paris', 'type': 'point', 'value': [2.3, 48.9]}

In [4]: pprint(Ntv.obj({"cities::point": [[2.3, 48.9], [4.8, 45.8] }).expand())
Out[4]: {'name': 'cities',
         'type': 'point',
         'value': [{'name': '', 'type': 'point', 'value': [2.3, 48.9]},
                   {'name': '', 'type': 'point', 'value': [4.8, 45.8]}]}

In [5]: pprint(Ntv.obj({"paris:point": [2.3, 48.9], "start:date": "2023-08-03", "measurement": 45.8}).expand())
Out[5]: {'name': '',
         'type': '',
         'value': [{'name': 'paris', 'type': 'point', 'value': [2.3, 48.9]},
                   {'name': 'start', 'type': 'date', 'value': '2023-08-03'},
                   {'name': 'measurement', 'type': 'json', 'value': 45.8}]}

Note: This typing syntax can also be used for CSV file headers

NTV structure

With this approach, two NTV entities are defined:

  • a primitive entity which is not composed of any other entity (NTV-single),
  • a structured entity which is an ordered sequence of NTV entities (NTV-list).

as well as two JSON formats:

  • simple format when the name and the type are not present (e.g. 25),
  • named format when the name or type is present ((e.g. {'age': 25} or {':int': 25})).

The type incorporates a notion of namespace that can be nested.

For example, the type: ns1.ns2.type_a means that:

  • ns1. is a namespace defined in the global namespace,
  • ns2. is a namespace defined in the ns1. namespace.,
  • type_a is defined in the ns2. namespace.

The type can be extended with additional data.

For example, the type: float[kg] means that:

  • float is a main type of the data,
  • kg is an additional type (e.g. an unit),
  • float[kg] may represent a Quantity.

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.

NTV uses

Several variations and use cases of the NTV format are defined:

  • Tabular and multidimensional data exchange format (e.g. open-data)
  • Compact, reversible and semantic pandas-JSON interface
  • Comment and change management of JSON data
  • visualization of JSON or NTV tree
  • JSON data editor
  • data validation (value conformity to the Datatype)

NTV and JSON

The flowchart below explain how to convert and exchange native entities through NTV and JSON format.

flowchart LR
    text["#10240;#10240;JSON#10240;#10240;\ntext"]
    val["#10240;JSON-NTV#10240;\nvalue"]
    ntv["#10240;#10240;#10240;NTV#10240;#10240;#10240;\nentity"]
    nat["#10240;native#10240;\nentity"]
    text--->|JSON load|val
    val--->|JSON dump|text
    val--->|NTV from JSON|ntv
    ntv--->|from NTV|nat
    ntv--->|NTV to JSON|val
    nat--->|to NTV|ntv

The conversion between native entity and JSON-text is reversible (lossless round trip).

In [6]: loc_and_date = {'newyear': date(2023, 1, 2), 'Paris': Point(2.3, 48.9)}
        json_loc_date = Ntv.obj(loc_and_date).to_obj(encoded=True)
        print(json_loc_date, type(json_loc_date))
Out[6]: {"newyear:date": "2023-01-02", "Paris:point": [2.3, 48.9]} <class 'str'>

In [7]: Ntv.obj(json_loc_date).to_obj(format='obj') == loc_and_date
Out[7]: True

Properties :

  • each NTV object has a unique JSON representation
  • each JSON data corresponds to a unique NTV entity
  • an NTV entity is a tree where each node is an NTV entity and each leaf an NTV-Single entity
  • an NTV entity is a neutral representation (independent of a software or hardware platform)

Metadata

Release files for json-ntv 1.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for json-ntv 1.4.0
File Size Uploaded
json_ntv-1.4.0.tar.gz 49.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for json-ntv 1.4.0
File Interpreter ABI Platform
json_ntv-1.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 91.1 kB

Release files / json_ntv-1.4.0.tar.gz

Download URL json_ntv-1.4.0.tar.gz
Size 49.5 kB
Tags Source
SHA-256 checksum
How to use checksums
279f0b774330aafc9a3fd2ec614491f6518f1368d384368d8d162db0e291b35d
BLAKE2b-256 checksum
How to use checksums
77876812d0f5159d612bf590348dee14d11ef0b06c6eb76044fea3656041b889
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Release files / json_ntv-1.4.0-py3-none-any.whl

Download URL json_ntv-1.4.0-py3-none-any.whl
Size 41.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c4c3b1b90ca637625a0d26f10dc6023d1b033061f66ce3faaabbec619ca8c6a3
BLAKE2b-256 checksum
How to use checksums
840c6386a9f334ad6930624a45e87df2bdc73d88f65c50d5262967643045d3f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Release history Release notifications | RSS feed

This release

1.4.0 This release

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.1.0

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page