(この記事は、2020年にQiitaに上げた記事の再投稿です。内容が古くなっている可能性がありますのでご了承ください。)

TL;DR

json.Unmarshal

invalid character 'ã' looking for beginning of value

というエラーが出た時は、JSON文字列に全角スペースが紛れている可能性大!!

{"name": "Taro"}

背景

APIサーバ実装中に上記のエラー発生。「 a がなんで不正やねん」と思いがっつりハマったので備忘録として書きました。 (※実際にはチルダのついた ã です)

環境

  • Go 1.14

サンプルコード

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形式チェックに使用)の定義

最後に

全角スペースはちゃんとハイライトしよう!