本記事は ディップ with 全部俺 Advent Calendar 2022 3日目の記事になります。
本日は掲題の通り、Go言語に関する記事です。
どういう記事?
Goでjsonを取り扱うとき、 "encoding/json"
の json.Unmarshal
を利用することがあると思います。
エラーハンドリングを if err !=nil
でやってしまうとある程度の情報は出してくれますが、ズバリこの辺!というのは知り得ない状態になってしまいます。
今回は、エラーのあった前後の文字を出力して、もう少し見やすいログにしようというコンセプトです。
どうやる?
早速回答から。
var data MyDataStruct
raw, err := ioutil.ReadFile("./example.json")
if err != nil {
log.Fatalf("ReadFile Error: %v", err)
}
if err := json.Unmarshal(raw, &data); err != nil {
//ここでパースエラーをキャッチします。
if err, ok := err.(*json.SyntaxError); ok {
log.Fatalf("Json Syntax Error(%s): %v", raw[err.Offset-15:err.Offset+15], err)
}
log.Fatalf("Json Unmarshal Error: %v", err)
}
errが、jsonパッケージに独自実装されている SyntaxError
かどうかの型判定を行い。
該当する場合、前後を抜き取る処理をします。
SyntaxErrorを見るとOffsetという項目が用意されており、これがエラーになった箇所が何文字目かを保持しています。
// A SyntaxError is a description of a JSON syntax error.
type SyntaxError struct {
msg string // description of error
Offset int64 // error occurred after reading Offset bytes
}
このOffsetを利用し、読み込んだデータの前後15文字を取得するという処理を書いています。
まとめ。
ちょっと前までこのコトを知らずいたので、知ったときはめっちゃ便利!と思いました。
ターミナルなど、Colorが使えるものなんかだとjsonを全文だして、該当部分だけ色を買えてみるなど使い方は色々できそうですね。