Go Unmarshal 문자열 또는 리스트 컬럼 받기

1 개요[ | ]

Go Unmarshal 문자열 또는 리스트 컬럼 받기
Go Unmarshal 문자열 또는 리스트인 컬럼 받기
Go Unmarshal 문자열 또는 문자열 리스트 컬럼 받기
package main

import (
	"encoding/json"
	"fmt"
)

type Item struct {
	ID        int              `json:"id"`
	Name      string           `json:"name"`
	Color     []string         `json:"-"`
	RawColor  json.RawMessage  `json:"color"`
}

func UnmarshalItem(j string) Item {
	item := Item{}
	bytes := []byte(j)
	if err := json.Unmarshal(bytes, &item); err != nil {
		panic(err)
	}
	if len(item.RawColor) > 0 {
		switch item.RawColor[0] {
		case '"':
			var s string
			if err := json.Unmarshal(item.RawColor, &s); err != nil {
				panic(err)
			}
			item.Color = []string{ string(s) }
		case '[':
			var s []string
			if err := json.Unmarshal(item.RawColor, &s); err != nil {
				panic(err)
			}
			item.Color = s
		}
	}
	item.RawColor = nil
	return item
}

func main() {
	j1 := `{"id":1,"name":"phone","color":["black","gray","white"]}`
	j2 := `{"id":2,"name":"car","color":["blue"]}`
	j3 := `{"id":3,"name":"apple","color":"red"}`
	j4 := `{"id":4,"name":"water","color":""}`
	j5 := `{"id":5,"name":"answer","color":42}`

	item1 := UnmarshalItem(j1)
	item2 := UnmarshalItem(j2)
	item3 := UnmarshalItem(j3)
	item4 := UnmarshalItem(j4)
	item5 := UnmarshalItem(j5)

	fmt.Printf("item1: %+v\n", item1)
	fmt.Printf("item2: %+v\n", item2)
	fmt.Printf("item3: %+v\n", item3)
	fmt.Printf("item4: %+v\n", item4)
	fmt.Printf("item5: %+v\n", item5)
}

2 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}