可読データー表現 (1)

Date: 2022/05/29 (initial publish), 2022/05/30 (last update)

Source: jp/note-00052.md

Previous Post Top Next Post

TOC

設定データーや設定に使うデーターベース等は、規則的な構造で可読化(エディターで閲覧編集)すると、既存ツールが使えて便利です。

可読データー表現法のリスト

振り返って見たら、 可読化されたデーターは結構色々使ってます。

ちょっと混乱してしまいそうです。XMLよりは読みやすく複雑なデーター記述ができながらコンピューター処理にも向いたフォーマットということで、「INI」, 「JSON」, 「TOML」, 「YAML」の4つのデーターシリアル化 (EN) (データーシリアル化 (JA)) 手法を見ていきます。

これらは、人間がエディターで触るのに比較的ハードルが低く、さらに多くのコンピューター言語で読み込み書き出しをするライブラリー化されサポートされているので、非常に使いやすいです。

可読データー表現例

INI

昔のWindowsの設定ファイルのデファクトスタンダード。2レベルまでのサポートという問題や、方言が多い問題がある。 Python標準ライブラリーでサポートれる。

; last modified 1 April 2001 by John Doe
[owner]
name = John Doe
organization = Acme Widgets Inc.

[database]
; use IP address in case network name resolution is not working
server = 192.0.2.62
port = 143
file = "payroll.dat"

TOML

TOMLは、INIに似ている。String, Integer, Float, Boolean, Datetime, Array, Table等の書式のスペシフィケーションが明示規定されている。 普通のINIより少し冗長。まもなく(Python 3.11~)Python標準ライブラリーでサポートれる。

# This is a TOML document.

title = "TOML Example"

[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # First class dates

[database]
server = "192.168.1.1"
ports = [ 8000, 8001, 8002 ]
connection_max = 5000
enabled = true

[servers]

  # Indentation (tabs and/or spaces) is allowed but not required
  [servers.alpha]
  ip = "10.0.0.1"
  dc = "eqdc10"

  [servers.beta]
  ip = "10.0.0.2"
  dc = "eqdc10"

[clients]
data = [ ["gamma", "delta"], [1, 2] ]

# Line breaks are OK when inside arrays
hosts = [
  "alpha",
  "omega"
]

JSON

ウエッブ関連でよく使われる書式。 冗長で人間がタイプし読むには少々難がある。(XMLやLispのS式(Symbolic expressions, S-expressions)ほどコンピューター側にに寄せていない) コンピューターが解釈するオーバヘッドは少ない。 Python標準ライブラリーでサポートれる。

{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 27,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [],
  "spouse": null
}

YAML

YAML version 1.2 は、JSONに対して、上位互換。かなり読みやすい。 Python標準ライブラリーにはないが、PYPIにPyYAML(YAML 1.1 parser)やruamel.yaml(YAML 1.2 parser)がある。

receipt:     Oz-Ware Purchase Invoice
date:        2012-08-06
customer:
    first_name:   Dorothy
    family_name:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      size:      8
      price:     133.7
      quantity:  1

bill-to:  &id001
    street: |
            123 Tornado Alley
            Suite 16
    city:   East Centerville
    state:  KS

ship-to:  *id001

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the
    man behind the curtain.

分かりにくいのは、ブロックスカラーの開始が「|」だと改行保持、「>」だと改行は1スペースに変換。

また、繰り返されるノードは、「&」を使いマークし、「*」を使い参照再利用できる。

Previous Post Top Next Post