📋

rfコマンドの実例: JSONをYAMLにYAMLをJSONに変換する

に公開

実例: JSONをYAMLにYAMLをJSONに変換する

JSONからYAML、逆にYAMLからJSONへ変換をしてみます。rfコマンドでは、任意のフォーマッタを選択できるため、出力する際にto_json,to_yamlを呼び出すことでフォーマットを変換することができます。

JSONからYAMLに変換する

以下のJSONファイルを変換してみます。

example-1.json
[
  {
    "id": 1,
    "name": "りんご",
    "price": {
      "regular": 150,
      "sale": 120
    },
    "details": {
      "category": "果物",
      "origin": "青森県",
      "nutritions": {
        "calories": 54,
        "vitamin_c": 4.0
      }
    }
  }
]

YAMLへの変換を行います。-s(--slurp)オプションを使用します。このオプションを使用しないと、レコードごとのYAMLが出力されてしまい元のJSONとは別物になってしまいます。

> rf j -s to_yaml example-1.json
- id: 1
  name: りんご
  price:
    regular: 150
    sale: 120
  details:
    category: 果物
    origin: 青森県
    nutritions:
      calories: 54
      vitamin_c: 4.0

YAMLからJSONに変換する

同様に以下のYAMLファイルをJSONに変換します。

example-1.yaml
- id: 1
  name: りんご
  price:
    regular: 150
    sale: 120
  details:
    category: 果物
    origin: 青森県
    nutritions:
      calories: 54
      vitamin_c: 4.0

rfコマンドを使ってJSONを変換します。

> rf y -s to_json example-1.yaml
[
  {
    "id": 1,
    "name": "りんご",
    "price": {
      "regular": 150,
      "sale": 120
    },
    "details": {
      "category": "果物",
      "origin": "青森県",
      "nutritions": {
        "calories": 54,
        "vitamin_c": 4.0
      }
    }
  }
]

Arrayではない場合-s(--slurp)をつけない

rf v1.32.2現在、入力されるJSON/YAMLがArrayではない場合に、-s(--slurp)オプションをつけると余分にArrayで括られてしまうというバグがあります。これを回避するためには、意図的に-s(--slurp)を外す必要があります。

example-2.json
{
  "store": "フルーツマート",
  "location": "東京都"
}

example-2.jsonを変換してみましょう。ここでは結果をわかりやすくするため、一旦YAMLに変換したあとに、JSONに戻してみます。

# YAML出力してみる
> rf j -s to_yaml example-2.json
- store: フルーツマート
  location: 東京都

# わかりやすさのため再度JSONに戻して比較
> rf j -s to_yaml example-2.json | rf y -s to_json
[
  {
    "store": "フルーツマート",
    "location": "東京都"
  }
]

Arrayの配下にObjectがあり、example-2.jsonとは別物になってしまいました。これを回避するためには-s(--skurp)をはずす必要があります

> rf j to_yaml example-2.json
store: フルーツマート
location: 東京都

rf j to_yaml example-2.json | rf y to_json
{
  "store": "フルーツマート",
  "location": "東京都"
}

この問題は今後のrfコマンドのアップデートで修正する予定です。

GitHubで編集を提案

Discussion