3
0

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 3 years have passed since last update.

身に覚えのない"invalid character 'ã' looking for beginning of value"の原因

Posted at

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

最後に

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

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?