Go

【Go】Json読み込み 想定外パラメータ

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
        }
    ]
}

サンプルプログラム

同じなので割愛します。

コメントを残す

メールアドレスが公開されることはありません。

© DeNnie.Lab All Rights Reserved.