4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ディップ with 全部俺Advent Calendar 2022

Day 3

Go言語でjsonパースしたときにどこがまずかったかを出力する小ネタ。

Last updated at Posted at 2022-12-02

本記事は ディップ 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を全文だして、該当部分だけ色を買えてみるなど使い方は色々できそうですね。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?