🐁

【Go】データ型の異なるJSONをDecodeする方法

2022/06/26に公開

以下の記事を参考に書きました。

https://zenn.dev/hsaki/articles/go-convert-json-struct

JSONのフィールドの型が混在している場合、なにも考えずにUnmarshallするとエラーになります。
例えば以下のような配列形式のJSONがあるとします。

本来であればhanakoさんのidはnumber型で0となっているべきですが""となっています。
こういった場合、interfaceでとりあえず読み込んでから、後で型付けすることで適切にdecodeすることが出来ます。

[{"name":"taro","id":1},{"name":"hanako","id":""},{"name":"kenji","id":2}]

https://go.dev/play/p/dQqzJleVpGc

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	jsonString := `[{"name":"taro","id":1},{"name":"hanako","id":""},{"name":"kenji","id":2}]`

	var Data []map[string]interface{}
	if err := json.Unmarshal([]byte(jsonString), &Data); err != nil {
		fmt.Println(err)
		return
	}
	students := make([]Student, 0)
	for _, v := range Data {
		s := convStudent(v)
		students = append(students, s)
	}
	fmt.Printf("%+v", students)
}

type Student struct {
	Name string
	Id   int
}

func convStudent(data map[string]interface{}) Student {
	var s Student
	s.Name = data["name"].(string)
	switch data["id"].(type) {
	case float64:
		s.Id = int(data["id"].(float64))
	default:
		s.Id = 0
	}
	return s
}

Discussion