jsonアンマーシャルで想定外のパラメータを読み込んだ場合の挙動について記載します。
目次
アンマーシャルエラー(パースエラー)
エラーハンドリングを行います。
jsonファイル
“name” キーの値 “sampleName” の後にカンマ(,)が存在する。
{
"name": "sample_name",
"events": [
{
"age": 10,
"name": "sampleName",
}
]
}
サンプルプログラム
package main
import (
"encoding/json"
"fmt"
"os"
)
// Jsonの内容を格納する構造体
type history struct {
Name string `json:"name" example:"sampleName"`
Events []event `json:"events"`
}
type event struct {
Age int `json:"age" example:"10"`
Name string `json:"name" example:"eventName"`
}
func main() {
h := history{}
// ファイル読み込み
f, err := os.Open("sample.json")
if err != nil {
return
}
// デコード
e := json.NewDecoder(f).Decode(&h)
if e != nil {
fmt.Println(e) // invalid character '}' looking for beginning of object key string
}
}
パラメータ型違い
想定しない型を読み込んだ場合、想定している型のゼロ値が設定されます。
jsonファイル
{
"name": "sample_name",
"events": [
{
"age": "十一",
"name": 0
}
]
}
サンプルプログラム
package main
import (
"encoding/json"
"fmt"
"os"
)
// Jsonの内容を格納する構造体
type history struct {
Name string `json:"name" example:"sampleName"`
Events []event `json:"events"`
}
type event struct {
Age int `json:"age" example:"10"`
Name string `json:"name" example:"eventName"`
}
func main() {
h := history{}
// ファイル読み込み
f, err := os.Open("sample.json")
if err != nil {
return
}
// デコード
json.NewDecoder(f).Decode(&h)
for _, v := range h.Events {
// int
fmt.Println(v.Age) // 0 が表示される
// string
if v.Name == "" {
fmt.Println("ブランクです。") // "ブランクです。" が表示される
}
}
}
パラメータがNULL
NULLを読み込んだ場合、想定している型のゼロ値が設定されます。
jsonファイル
{
"name": "sample_name",
"events": [
{
"age": null,
"name": null
}
]
}
サンプルプログラム
同じなので割愛します。