TL;DR
json.Unmarshal
で
invalid character 'ã' looking for beginning of value
というエラーが出た時は、JSON文字列に全角スペースが紛れている可能性大!!
スペースが全角になっている
{"name": "Taro"}
背景
APIサーバ実装中に上記のエラー発生。「a
がなんで不正やねん」と思いがっつりハマったので備忘録として書きました。
(※実際にはチルダのついたã
です)
環境
- Go 1.14
サンプルコード
main.go
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
}
func main() {
// コロンの直後に全角が!
jsonStr := `{"name": "Taro"}`
person := Person{}
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
fmt.Println(err.Error()) // invalid character 'ã' looking for beginning of value
}
}
なぜエラーに'ã'が出てくるのか
全角文字の先頭バイト227
に対応するutf-8の文字がã
だからです。
Unmarshal
には[]byte
を渡しているので、全角文字の先頭バイトã
を読み込んだ時点でパースエラーになったというのが原因でした。
fmt.Println([]byte(" ")) // [227 128 128]
fmt.Println(string(227)) // ã
encoding/json
の実装を見ても、1バイトずつ読み込んで、スキャナが解釈できないバイトが見つかった時点でエラーを吐いていることが分かります。
Unmarshalの定義
checkValid(Unmarshal内部でJSON形式チェックに使用)の定義
最後に
全角スペースはちゃんとハイライトしよう!