ISONはJSONとの互換性を持ちつつも日付や他の型のサポートやコメントなどの機能を拡張したフォーマットです。
型
ISONにはJSONにない型がいくつかあります。
日付型
UNIXタイムスタンプを使って日付を表す型(Data)があります。
Date(1532524806137)
数値型
16進数、2進数、8進数のリテラルがサポートされています。
8進数の表記がC言語と異なっていることに注意が必要です。
{
a: 0xFF, // Hex
b: 0b11111111, // Binary
c: 0o377, // Octal
d: 255 // Decimal
}
文字列型
文字列はダブルクォートだけではなくシングルクォートで囲むことができます。
オブジェクト型
オブジェクト型のキーはこの正規表現 /[a-z_][_a-z0-9]*/i
にマッチする場合にはクォートで囲む必要がないです。
Object型を表現するためには2通りの方法がありますが後者の方がシンプルなので望ましいです。
Object({ a: 1 }) === { a: 1 }
配列型
配列型を表現するためにも2通りの方法がありますが、オブジェクト型と同様に後者の方がシンプルなので望ましいです。
Array( 1, 2, 3 ) === [ 1, 2, 3 ]
その他の型
ISONはbuffer, 正規表現、集合、マップなどの型もサポートしています。
これらの方はデシリアライズした際に、各言語の対応する方に変換されることが期待されています。
{
// Dates via unix timestamp
created: Date(1532571987475),
// Buffers stored in hex, ascii, etc.
data: Buffer('deadbeef', 'hex'),
name: Buffer('hello, world!', 'ascii'),
// Regular expressions
regex: RegExp('0x[a-f0-9]+', 'i'),
// Sets
set: Set([ 1,2,3,4 ]),
// Maps
map: Map([
['abc', 'def'],
['ghi', 'jkl']
])
}
カスタム型
更にISONはカスタム型を追加するためのインターフェースも持っています。
以下の例はLocation型というカスタム型を追加しています。
const ison = require('ison')
class Location {
constructor({ latitude, longitude }) {
this.latitude = latitude
this.longitude = longitude
}
destructor() {
return {
latitude: this.latitude,
longitude: this.longitude
}
}
}
ison.addTypes({ Location }) // Required for parsing locations back into a Location instance
ison.stringify(new Location({ latitude: 12.3456, longitude: 98.6765 })) // -> 'Location({latitude:12.3456,longitude:98.6765})'