読者です 読者をやめる 読者になる 読者になる

Yet Another JSON な json5をgolangでparseできる奴を作った

golang

このエントリは Go Advent Calendar 2014 の記事です。

さて、僕はJSONSchemaで疲弊してたんですが、主に疲弊してた理由としてはJSONの表現力不足(ケツカンマ許さない、コメントかけない等)とJSONSchema Validatorで不正な値があった時の情報量の少なさでして、JSONの表現力不足に関しては皆さんYAML使ったりして色々解決してるとは思います。

そこで自分もYAMLではなく、JSON5使って解決しようと考えてgolangで実装してみました。

JSON5の詳細に関してはこちらのエントリを参考にされると良いかと思います。

普通にjson5をインストールする

インストールは簡単。

$ brew tap yosuke-furukawa/json5
$ brew install json5

そんで、こんな感じのjson5ファイルを用意して、

// This is json5 demo
// json5 can write comment in your json
{
  key : "Key does not need double quote",
  // json specific
  "of" : "course we can use json as json5",
  trailing : "trailing comma is ok",
}

デモ:

$ json5 -c example.json5
{
    "key": "Key does not need double quote",
    "of": "course we can use json as json5",
    "trailing": "trailing comma is ok"
} 

ってな感じにちゃんとしたjsonが返ってくるようになります。
これでコメントも書けてケツカンマにも対応して、キーをダブルクオートで括る必要がないJSON5が使えるようになりました。

プログラマブルに使うなら

$ go get github.com/yosuke-furukawa/json5/encoding/json5

ってしてから

package main

import (
    "encoding/json"
    "fmt"
    "github.com/yosuke-furukawa/json5/encoding/json5"
    "os"
)

func main() {
    var data interface{}
    dec := json5.NewDecoder(os.Stdin)
    err := dec.Decode(&data)
    if err != nil {
        fmt.Println(err)
    }
    b, err := json.MarshalIndent(data, "", "    ")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(b))
}

こんな感じで使います。

ただまだブロックコメントやマルチ行文字列に対応してないので、その辺は今後実装していきます。


yosuke-furukawa/json5 · GitHub