Ion is an interface design language created in 2016.
#1640on PLDB | 8Years Old |
Amazon Ion is a richly-typed, self-describing, hierarchical data serialization format offering interchangeable binary and text representations. The text format (a superset of JSON) is easy to read and author, supporting rapid prototyping. The binary representation is efficient to store, transmit, and skip-scan parse.
/* Ion supports comments. */
// Here is a struct, which is similar to a JSON object
{
// Field names don't always have to be quoted
name: "Fido",
// This is an integer with a 'years' annotation
age: years::4,
// This is a timestamp with day precision
birthday: 2012-03-01T,
// Here is a list, which is like a JSON array
toys: [
// These are symbol values, which are like strings,
// but get encoded as integers in binary
ball,
rope,
],
// This is a decimal -- a base-10 floating point value
weight: pounds::41.2,
// Here is a blob -- binary data, which is
// base64-encoded in Ion text encoding
buzz: {{VG8gaW5maW5pdHkuLi4gYW5kIGJleW9uZCE=}},
}
Feature | Supported | Example | Token |
---|---|---|---|
MultiLine Comments | β | /* A comment */ | /* */ |
Line Comments | β | // A comment | // |
S-Expressions | β | null.sexp // A null S-expression value () // An empty expression value (cons 1 2) // S-expression of three values ([hello][there]) // S-expression containing two lists (a+-b) ( 'a' '+-' 'b' ) // Equivalent; three symbols (a.b;) ( 'a' '.' 'b' ';') // Equivalent; four symbols | |
Lists | β | null.list // A null list value [] // An empty list value [1, 2, 3] // List of three ints [ 1 , two ] // List of an int and a symbol [a , [b]] // Nested list [ 1.2, ] // Trailing comma is legal in Ion (unlike JSON) [ 1, , 2 ] // ERROR: missing element between commas | |
Type Annotations | β | int32::12 // Suggests 32 bits as end-user type 'my.custom.type' :: { x : 12 , y : -1 } // Gives a struct a user-defined type { field: something::'another thing'::value } // Field's name must precede annotations of its value jpeg :: {{ ... }} // Indicates the blob contains jpeg data bool :: null.int // A very misleading annotation on the integer null '' :: 1 // An empty annotation null.symbol :: 1 // ERROR: type annotation cannot be null | |
hasSymbols | β | myvar2 // A different symbol 'hi ho' // Symbol requiring quotes | |
Decimals | β | null.decimal // A null decimal value 0.123 // Type is decimal -0.12d4 // Type is decimal 123_456.789_012 // Decimal with underscores -0d-1 // Decimal maintains precision: -0. != -0.0 -0d0 // Negative zero decimal (distinct from positive zero) | |
hasTimestamps | β | // Timestamps represent a specific moment in time, always include a local offset, and are capable of arbitrary precision. 2007-02-23T12:14Z // Seconds are optional, but local offset is not 2007-01-01T00:00-00:00 // Happy New Year in UTC, unknown local offset | |
Clobs | β | // The clob type is similar to blob in that it holds uninterpreted binary data. The difference is that the content is expected to be text, so we use a text notation thatβs more readable than Base64. // An Ion clob type is similar to the blob type except that the denotation in the Ion text format uses an ASCII-based string notation rather than a base64 encoding to denote its binary value. It is important to make the distinction that clob is a sequence of raw octets and string is a sequence of Unicode code points. // The string may only contain legal 7-bit ASCII character | |
hasBlobs | β | // In the text format, blob values are denoted as RFC 4648-compliant Base64 text within two pairs of curly braces. // A valid blob value with one required padding character. {{ VG8gaW5maW5pdHkuLi4gYW5kIGJleW9uZCE= }} | |
Strings | β | "hello world" | |
Null | β | null | |
Multiline Strings | β | ( '''hello ''' // Sexp with one element '''world!''' ) ("hello world!") // The exact same sexp value // This Ion value is a string containing three newlines. The serialized // form's first newline is escaped into nothingness. '''\ The first line of the string. This is the second line of the string, and this is the third line. ''' | |
Integers | β | // http://amzn.github.io/ion-docs/docs/spec.html null.int // A null int value 0 // Zero. Surprise! -0 // ...the same value with a minus sign 123 // A normal int -123 // Another negative int 0xBeef // An int denoted in hexadecimal 0b0101 // An int denoted in binary 1_2_3 // An int with underscores 0xFA_CE // An int denoted in hexadecimal with underscores 0b10_10_10 // An int denoted in binary with underscores | |
Assignment | β | // A subset of symbols called identifiers can be denoted in text without single-quotes. | |
Floats | β | // http://amzn.github.io/ion-docs/docs/spec.html -0.12e4 // Type is float | |
Structs | β | { first : "Tom" , last: "Riddle" } // Structure with two fields {"first":"Tom","last":"Riddle"} // The same value with confusing style {center:{x:1.0, y:12.5}, radius:3} // Nested struct | |
Comments | β | ||
Booleans | β | null.bool true false | |
Semantic Indentation | X |