ryoakg
9/25/2015 - 2:58 AM

JSON, YAML, ini, TOML ざっくり比較

JSON, YAML, ini, TOML ざっくり比較

- 参考
  - http://hr-sano.net/blog/2014/10/26/1729/

# JSON

https://ja.wikipedia.org/wiki/JavaScript_Object_Notation

## メリット
- Python標準に含まれている
- 仕様が厳格に決まっている

## デメリット
- ファイル内にコメントが書けない
- 末尾コンマ消し忘れるとエラー
- カッコ多い
- 書くの簡単じゃないかも

## 例
### 一つにまとめる場合
```js
[
  {"path": "C:\\Download\\paper",
   "extension": ["pdf", "doc"],
   "destination": ["C:\\Dropbox\\論文\\*", "C:\\My Documents\\査読\\*"]},
  {"path": "C:\\Download\\music",
   "extension": ["mp3", "wav", "mp4"],
   "destination": ["C:\\Dropbox\\音楽\\*", "C:\\My Music\\*"]}
]
```

### 分割する場合
#### 全体の設定ファイル (監視対象のフォルダ一覧)

```js
{
  path: ["C:\\Download\\paper", "C:\\Download\\music"]
}
```

#### C:\Download\paper の設定ファイル
```js
{
  extension: ["pdf", "doc"],
  destination:  ["C:\\Dropbox\\論文\\*", "C:\\My Documents\\査読\\*"]
}
```

#### C:\Download\music の設定ファイル
```js
{
  extension: ["mp3", "wav", "mp4"],
  destination: ["C:\\Dropbox\\音楽\\*", "C:\\My Music\\*"]
}
```

# yaml

https://ja.wikipedia.org/wiki/YAML

## メリット
- コメント書ける
- 末尾コンマとかあってもなくても大丈夫(たぶん)

## デメリット
- 書くのが難しいらしい?
  - インデント(字下げ)が難しい?
- Python標準ライブラリに含まれていない
- バージョンが幾つか存在するらしく、ハマりポイントらしい

## 例

### 一つにまとめる場合

```yaml
# これはコメント行
- path: 'C:\Download\paper'
  extension:
    - 'pdf'
    - 'doc'
  destination:
    - 'C:\Dropbox\論文\*'
    - 'C:\My Documents\査読\*'
- path: 'C:\Download\music'
  extension: ['mp3', 'wav', 'mp4']  # こういう書き方もできる
  destination: ['C:\Dropbox\音楽\*', 'C:\My Music\*']
```

### 分割する場合
#### 全体の設定ファイル (監視対象のフォルダ一覧)

```yaml
path: ['C:\Download\paper', 'C:\Download\music']
# または
path: 'C:\Download\paper'
      'C:\Download\music'
```

#### C:\Download\paper の設定ファイル
```yaml
extension:
  - pdf
  - doc
destination:
  - 'C:\Dropbox\論文\*'
  - 'C:\My Documents\査読\*'
```

#### C:\Download\music の設定ファイル

```yaml
# こういう書き方もできる
extension: ["mp3", "wav", "mp4"]
destination: ["C:\\Dropbox\\音楽\\*", "C:\\My Music\\*"]
```

# ini

Windows系の設定ファイルでよく見る形式

## メリット

- 読み書きが簡単
- Python標準ライブラリに含まれている
- バックスラッシュのエスケープ不要

## デメリット

- 複雑な機能はない
  - すべて文字列型
  - リストが使えない!
- 仕様が厳格に決まっていない
  - Pythonで使うだけならConfigParserの仕様に従えば問題にならなそう

## 例

### 一つにまとめる場合
リスト使えない???

```ini
# これはコメント行
[C:\Download\paper]
extension=
  pdf
  doc
destination=
  C:\Dropbox\論文\*
  C:\My Documents\査読\*

[C:\Download\music]
extension=
  mp3
  wav
  mp4
destination=
  C:\Dropbox\音楽\*
  C:\My Music\*
```

同じ構造じゃ無理でした

### 分割する場合
#### 全体の設定ファイル (監視対象のフォルダ一覧)

```ini
path =
  C:\Download\paper
  C:\Download\music
```

#### C:\Download\paper の設定ファイル
```ini
extension =
  pdf
  doc

destination =
  C:\Dropbox\論文\*
  C:\My Documents\査読\*
```

#### C:\Download\music の設定ファイル

```ini
# こういう書き方もできる?
[extension]
mp3
wav
mp4

[destination]
C:\Dropbox\音楽\*
C:\My Music\*
```

# TOML

ini風?
仕様: https://github.com/toml-lang/toml#user-content-integer
仕様の和訳: http://qiita.com/minoritea/items/c0de47b8beb813c655d4

## メリット
- ini風だけど明瞭・高機能
- コメントも書ける

## デメリット
- 仕様が変更される可能性がある(まだ正式版リリースではない)
- Python標準ライブラリに含まれていない
- 難しいところがあるかも

## 例

### 一つにまとめる場合

```toml
# これはコメント行
['C:\Download\paper']
extension = ['pdf', 'doc']
destination = ['C:\Dropbox\論文\*', 'C:\My Documents\査読\*']

['C:\Download\music']
extension=['mp3', 'wav', 'mp4']
destination=['C:\Dropbox\音楽\*', 'C:\My Music\*']
```

### 分割する場合
#### 全体の設定ファイル (監視対象のフォルダ一覧)

```toml
path = [
  'C:\Download\paper',
  'C:\Download\music',  # 最後のコンマはあってもなくてもOK
]
```

#### C:\Download\paper の設定ファイル
```toml
extension = [
  'pdf',
  'doc'
]

destination = [
  'C:\Dropbox\論文\*',
  'C:\My Documents\査読\*'
]
```

#### C:\Download\music の設定ファイル

```toml
# こういう書き方もできる? 保留!
extension = [
  "mp3",
  "wav",
  "mp4"
]

destination = [
  "C:\\Dropbox\\音楽\\*",
  "C:\\My Music\\*"
]
```