PSONはpuppetという自動化ソフトウェアで使われるシリアライゼーションフォーマットで、JSONの亜種だそうです。
JSONは文字コードとしてUTF-8を採用していますが、PSONは8bit-ACSIIを採用しているため任意のバイト列を表すことができます。
JSONとの違い
以下の型の表についてJSONとPSONの違いはありません。
- オブジェクト
- 配列
- 数値
- ブール値
- null
文字列のみがJSONとPSONで異なります。
PSON文字列は8bit ASCIIでエンコードされたバイト列で、JSONとは異なりUTF-8的にinvalidate(対応する文字がない)バイト表現であったとしてもPSONではOKです。
一部の特殊文字はJSONとの互換性のためか特殊なエンコード方法で表現する必要があるようです。
Byte | ASCII Character | Encoded Sequence | Encoded ASCII Sequence |
---|---|---|---|
0x22 | " | 0x5C, 0x22 | " |
0x5c | \ | 0x5C, 0x5C | \ |
0x08 | Backspace | 0x5C, 0x62 | \b |
0x09 | Horizontal Tab | 0x5C, 0x74 | \t |
0x0A | Line Feed | 0x5C, 0x6E | \n |
0x0C | Form Feed | 0x5C, 0x66 | \f |
0x0D | Carriage Return | 0x5C, 0x72 | \r |
さらに、0x00から0x1Fまでの文字は \u に続いて4バイトのバイトを並べる必要があります。例えばASCIIコードでのレコード区切り文字0x1Eは\u001Eと表現されます。
PSONのデコード方法
多くの言語にはすでにJSONパーサーがあり、これらのパーサーに対してをLatin-1エンコードと解釈するように指示すればPSONをパースできます。
例えば以下のようなデータを持つdata.psonというファイルを想定します。
0x7b 0x22 0x64 0x61 0x74 0x61 0x22 0x3a 0x22 0x5c 0x75 0x30 0x30 0x30 0x37 0x5c 0x62 0xc3 0xc3 0x22 0x7d
このファイルをパースするために、Pythonでは以下のようにします。
>>> import json
>>> json.load(open("data.pson"), "latin_1")
{u'data': u'\x07\x08\xc3\xc3'}
出展: