Go로 코드 마이그레이션을 진행하거나 json형태의 string을 한 칼럼에 넣었을 때 추후 go 에서 사용하게 될 경우가 있습니다. 이때 쿼리 결과값을 들고와 json 칼럼의 값들을 사용하기 위해  json.Unmarshal()을 사용할겁니다. 
하지만 json칼럼 중 tier라는 키값에 저장된 값이 int, string 둘다 저장되어 있을경우가 있다면 go 는 주저없이 error를 뱉어버립니다.
이미 데이터는 저장되어있고 난감한 상황일 경우 interface type을 이용해 사용할 수 있는 방법을 보겠습니다.

 

extraData 칼럼의 JSON

{
    {
        id: 1,
        userId: "123093",
        name: "asdf"
        tier: "2"
        lastUpdateDate: "2023-01-02 09:00:00"
    },
    {
    	id: 31,
        userId: 29392812,
        name: "lisiekd"
        tier: 4
        lastUpdateDate: "2023-04-01 18:00:00"
    }
}

 

json을 풀기 위한 struct

type extraData struct {
	Id int `json:id`
	UserId interface{} `json:userId`
	Name string `json:name`
	Tier interface{} `json:tier`
	LastUpdateDate time.Time `json:lastUpdateDate`
}

 

userId, tier 형변환 사용

func (e extraData) GetUserId() string {
	return e.UserId.(string)
}

func (e extraData) GetTier() int {
	tier, _ := strconv.Atoi(e.Tier.(string))
 	return tier
}

위와같이 interface{}로 선언 후 사용할 타입에 맞춰 변환 후 함수로 내려주어 사용할 수 있습니다.

반응형

'Go' 카테고리의 다른 글

Go - ioutil 패키지 deprecated  (0) 2023.04.25
rwMutex 사용  (0) 2023.04.18
gorm 조건에 따른 Where() 사용하기  (0) 2023.03.24
golang time.AddDate()  (0) 2023.03.21
env 환경변수 사용  (0) 2023.03.09

+ Recent posts