🐁
【Go】データ型の異なるJSONをDecodeする方法
以下の記事を参考に書きました。
JSONのフィールドの型が混在している場合、なにも考えずにUnmarshallするとエラーになります。
例えば以下のような配列形式のJSONがあるとします。
本来であればhanakoさんのidはnumber型で0となっているべきですが""となっています。
こういった場合、interfaceでとりあえず読み込んでから、後で型付けすることで適切にdecodeすることが出来ます。
[{"name":"taro","id":1},{"name":"hanako","id":""},{"name":"kenji","id":2}]
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