본문 바로가기

Programming Language/golang

json value가 null일때 golang은 Unmarshal을 잘 할 수 있을까?

golang은 JSON Format 데이터를 struct로 변환할 수 있는데 이것을 Unmarshal이라고 부릅니다. 예를 들어 다음과 같은 함수로 구현될 수 있습니다.

func getStructFromJSON(jsonData string, valuePtr interface{}) error {
	return json.Unmarshal([]byte(jsonData), valuePtr)
}

 

  • jsonData : json포맷으로된 String 데이터
  • valuePtr : struct타입

예를 들어 다음과 같이 호출할 수 있습니다.

type SampleStruct struct {
	A int32 `json:"a"`
	B int32 `json:"b"`
}

func main() {

	var valuePtr SampleStruct
	err := getStructFromJSON("{\"a\": 13,\"b\": 11}", &valuePtr)
	if err != nil {
		log.Print(err)
	}
	log.Print(valuePtr.A)
	log.Print(valuePtr.B)
}

결과는 다음과 같습니다.

2024/01/01 16:50:25 13
2024/01/01 16:50:25 11

 

그런데 만약에 숫자 대신에 null이 들어가 있으면 어떻게 될까요?

{"a": 13,"b": null}

상기 데이터가 들어갈 경우 결과는 다음과 같습니다.

2024/01/01 16:51:28 13
2024/01/01 16:51:28 0

0으로 초기화 되는 것을 알 수 있습니다. 

 

만약 0으로 초기화가 아니라 null로 초기화 하고 싶다면?

golang에서 int32는 nil 표현이 불가능합니다. 만약 nil을 표현하고 싶다면 pointer 타입으로 정의해야 합니다. 

type SampleStruct struct {
	A int32  `json:"a"`
	B *int32 `json:"b"`
}
func main() {

	var valuePtr SampleStruct
	err := getStructFromJSON("{\"a\": 13,\"b\": null}", &valuePtr)
	if err != nil {
		log.Print(err)
	}
	log.Print(valuePtr.A)
	log.Print(valuePtr.B)
}

실행시 결과는 다음과 같습니다.

2024/01/01 16:53:08 13
2024/01/01 16:53:08 <nil>

 

 

반응형