This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these messages)
|
| Ion | |
|---|---|
| Filename extension |
.ion |
| Internet media type | application/ion |
| Developed by | Amazon |
| Type of format | Data interchange |
| Website | amzn |
Ion is a data serialization language developed by Amazon. It may be represented by either a human-readable text form or a compact binary form. The text form is a superset of JSON; thus, any valid JSON document is also a valid Ion document.
Data types
[edit]As a superset of JSON, Ion includes the following data types
null: An empty value (for JSON compatibility)bool: Boolean valuesstring: Unicode text literalslist: Ordered heterogeneous collection of Ion values (extension of JSON array)struct: Unordered collection of key/value pairs (extension of JSON object)
The nebulous JSON 'number' type is strictly defined in Ion to be one of
int: Signed integers of arbitrary sizefloat: 64-bit IEEE binary-encoded floating point numbersdecimal: Decimal-encoded real numbers of arbitrary precision
Ion adds these types:
timestamp: Date/time/time zone moments of arbitrary precisionsymbol: Unicode symbolic atoms (aka identifiers), stored as interned strings in binary formatblob: Binary data of user-defined encodingclob: Text data of user-defined encodingsexp: Nested list of values (equivalent to an S-expression) with application-defined semantics
Each Ion type supports a null variant, indicating a lack of value while maintaining a strict type (e.g., null.int, null.struct).
The Ion format permits attaching one or more annotations (i.e. a list of symbols) to any value. Such annotations may be used as metadata for otherwise opaque data (such as a blob).
Implementations
[edit]Examples
[edit]Sample document
[edit]Features seen in JavaScript and JSON5:
// Comments are allowed using the double forward slash
{
key: "value", // key here is a symbol, it can also be a string as in JSON
nums: 1_000_000, // equivalent to 1000000, use of underscores with numbers is more readable
"A float": 31415e-4, // key is a value that contains spaces
}
Features unique to Ion:
{
symbol: 'a symbol', // symbols are interned Unicode strings
"A null integer": null.int,
annotated: age::35, // the symbol "age" is attached to the value "35" as an annotation
lists : 'hw grades'::[80, 85, 90], // any symbol can be used as an annotation
many_annot: I::have::many::annotations::true, // annotations are not nested, but rather, a list of annotations
sexp: (this (is a [valid] "Ion") last::value + 42) // Ion S-expressions. 'this', 'is', 'a', 'valid', 'value', and '+' are symbols.
_value: {{OiBTIKUgTyAASb8=}}, // blob value is represented as base64
_value: {{"a b\0\xff"}} // clob value is represented as an ASCII string with C-style escapes
// ^ repeated names (keys) are allowed but generate a warning for undefined behavior
}
Uses
[edit]- Amazon's Quantum Ledger Database (QLDB) stores data in Ion documents.[1]
- PartiQL, an open source SQL-based query language also by Amazon, is built upon Ion. PartiQL supported queries are used by QLDB, S3Select.[2]
Tooling and extensions
[edit]- Ion Path Extractor API aims to combine the convenience of a DOM API with the speed of a streaming API.
- IDE support
- Jackson data format module for Ion
- Apache Hive SerDe for Ion
- Ion Schema
- Ion Hash defines an algorithm for constructing a hash for any Ion value, given a user-provided hash function capable of taking binary data of arbitrary length.