5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2024

Day 15

PSONについて

Last updated at Posted at 2024-12-14

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'}

出展:

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?