2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Go에서 JSON 데이터를 구조체로 변환하는 방법은 무엇인가요?

_____
Q: Go에서 JSON 데이터를 구조체로 변환하는 방법은 무엇인가요?
A: Go에서는 `encoding/json` 패키지의 `json.Unmarshal` 함수를 사용해 JSON 데이터를 구조체로 변환할 수 있습니다. 기본 절차는 다음과 같습니다.

1. JSON 데이터를 담을 구조체 정의
```go
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
```

2. JSON 문자열 또는 바이트 배열 준비
```go
jsonData := []byte(`{"name": "Alice", "age": 30}`)
```

3. `json.Unmarshal` 호출하여 구조체에 데이터 채우기
```go
var p Person
err := json.Unmarshal(jsonData, &p)
if err != nil {
// 오류 처리
log.Fatal(err)
}
```

4. 변환된 구조체 사용
```go
fmt.Println(p.Name) // Alice
fmt.Println(p.Age) // 30
```

---

Q: JSON 태그(`json:"..."`)는 무슨 역할을 하나요?
A: 구조체 필드 뒤에 붙이는 JSON 태그는 해당 필드가 JSON의 어떤 키와 매핑될지 지정합니다. 예를 들어, `Name string `json:"name"` `는 JSON 키 "name"에 매핑됩니다. 태그가 없으면 기본적으로 구조체 필드 이름과 JSON 키가 일치하는지 여부로 매핑합니다.

---

Q: JSON 필드가 누락되었을 경우 어떻게 되나요?
A: JSON에 특정 필드가 없으면 해당 구조체 필드에는 기본값(예: 문자열은 빈 문자열, 숫자는 0)이 할당됩니다. `omitempty` 태그는 주로 JSON 인코딩 시 필드를 생략할 때 사용되므로 디코딩에는 영향을 주지 않습니다.

---

Q: JSON 배열을 구조체 슬라이스로 변환하는 방법은?
A: JSON 배열도 마찬가지로 슬라이스 타입 구조체에 Unmarshal하면 됩니다.
예:
```go
jsonData := []byte(`[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]`)
var people []Person
err := json.Unmarshal(jsonData, &people)
```

---
Q: JSON 필드가 대소문자가 다를 경우 어떻게 매핑하나요?
A: 기본적으로 Go의 JSON 언마샬러는 구조체 필드명과 JSON 키를 대소문자 구분 없이 매칭하지만, 보다 명확하게 하려면 JSON 태그를 사용하세요. 예:
```go
Name string `json:"full_name"`
```

---

Q: JSON에서 특정 필드의 타입이 가변적일 경우 어떻게 처리하나요?
A: 이 경우 해당 필드를 `interface{}` 타입으로 선언하거나, 원하는 타입 구조체를 만들어 사용자 정의 언마샬러를 구현할 수 있습니다. 예를 들어:
```go
Data interface{} `json:"data"`
```

---

Q: JSON에 포함된 날짜 형식 데이터를 Go 시간 형식으로 변환하려면?
A: 구조체 필드를 `time.Time` 타입으로 선언 후, JSON의 날짜 문자열이 RFC3339 형식이라면 자동으로 파싱됩니다. 그렇지 않은 형식은 커스텀 언마샬러를 구현해야 합니다.
예:
```go
type Event struct {
Date time.Time `json:"date"`
}
```

---

Q: JSON Unmarshal 중 발생하는 오류는 어떻게 확인하나요?
A: `json.Unmarshal` 함수가 반환하는 `error` 값을 반드시 체크해야 합니다. 오류가 발생하면 해당 오류 메시지를 출력하거나 처리하여 디코딩 실패 원인을 확인할 수 있습니다.

---

Q: 중첩된 JSON 데이터는 어떻게 구조체로 변환하나요?
A: 중첩된 JSON 객체는 구조체 내부에 또 다른 구조체 타입 필드를 선언하면 됩니다. 예:
```go
type Address struct {
City string `json:"city"`
State string `json:"state"`
}

type Person struct {
Name string `json:"name"`
Address Address `json:"address"`
}
```

---

Q: JSON에서 값이 null일 때 Go 구조체 필드에 어떻게 처리되나요?
A: 기본 타입 필드는 null을 0 값으로 변환합니다. null 가능성을 구분하려면 포인터 타입(`*int`, `*string` 등)이나 `sql.NullString`, `encoding/json`의 `json.RawMessage` 등을 활용할 수 있습니다.
예:
```go
Age *int `json:"age"`
```

요약하면, Go에서 JSON을 구조체로 변환하려면 `encoding/json` 패키지의 `json.Unmarshal`을 이용하며, 적절한 구조체 정의와 JSON 태그로 매핑 규칙을 명확히 해주는 것이 가장 중요한 점입니다.
Go에서 JSON 데이터를 구조체로 변환하는 방법은 매우 간단하고 직관적입니다.

Go 언어는 `encoding/json` 패키지를 제공하여 JSON 데이터를 쉽게 인코딩(구조체를 JSON으로 변환)하고 디코딩(JSON을 구조체로 변환)할 수 있도록 지원합니다.

아래에서는 JSON 데이터를 구조체로 변환하는 방법에 대해 자세히 설명하겠습니다.

1. 구조체 정의 먼저, JSON 데이터의 구조에 맞는 Go 구조체를 정의해야 합니다.

JSON의 키는 구조체의 필드 이름과 일치해야 하며, JSON의 키와 구조체의 필드 이름이 다를 경우 `json` 태그를 사용하여 매핑할 수 있습니다.

예를 들어, 다음과 같은 JSON 데이터가 있다고 가정해 보겠습니다.

```json { "name": "John Doe", "age": 30, "email": "[email protected]" } ``` 이 JSON 데이터를 표현하기 위한 Go 구조체는 다음과 같이 정의할 수 있습니다.

```go type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` } ```

2. JSON 데이터 디코딩 이제 JSON 데이터를 구조체로 변환하기 위해 `json.Unmarshal` 함수를 사용할 수 있습니다.

이 함수는 JSON 데이터를 바이트 슬라이스로 받아서 지정된 구조체에 디코딩합니다.

다음은 JSON 데이터를 구조체로 변환하는 예제입니다.

```go package main import ( "encoding/json" "fmt" "log" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` } func main() { jsonData := []byte(`{"name": "John Doe", "age": 30, "email": "[email protected]"}`) var person Person err := json.Unmarshal(jsonData, &person) if err != nil { log.Fatalf("Error decoding JSON: %s", err) } fmt.Printf("Name: %s\n", person.Name) fmt.Printf("Age: %d\n", person.Age) fmt.Printf("Email: %s\n", person.Email) } ```

3. 에러 처리 JSON 디코딩 과정에서 오류가 발생할 수 있으므로, 항상 에러를 체크하는 것이 중요합니다.

위의 예제에서는 `json.Unmarshal` 호출 후 에러를 체크하고, 에러가 발생하면 프로그램을 종료하도록 설정했습니다.



4. JSON 배열 디코딩 JSON 데이터가 배열 형태인 경우, 구조체의 슬라이스를 사용하여 디코딩할 수 있습니다.

예를 들어, 다음과 같은 JSON 배열이 있다고 가정해 보겠습니다.

```json [ {"name": "John Doe", "age": 30, "email": "[email protected]"}, {"name": "Jane Smith", "age": 25, "email": "[email protected]"} ] ``` 이 경우, 구조체 슬라이스를 정의하고 디코딩할 수 있습니다.

```go package main import ( "encoding/json" "fmt" "log" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` } func main() { jsonData := []byte(`[ {"name": "John Doe", "age": 30, "email": "[email protected]"}, {"name": "Jane Smith", "age": 25, "email": "[email protected]"} ]`) var people []Person err := json.Unmarshal(jsonData, &people) if err != nil { log.Fatalf("Error decoding JSON: %s", err) } for _, person := range people { fmt.Printf("Name: %s, Age: %d, Email: %s\n", person.Name, person.Age, person.Email) } } ```

5. JSON 태그 구조체 필드에 사용되는 `json` 태그는 JSON 키와 Go 필드 간의 매핑을 정의합니다.

태그를 사용하여 JSON 키의 이름을 변경하거나, 특정 필드를 생략할 수 있습니다.

예를 들어, 다음과 같이 태그를 설정할 수 있습니다.

```go type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` // Age가 0일 경우 생략 Email string `json:"email"` } ``` 결론 Go에서 JSON 데이터를 구조체로 변환하는 과정은 `encoding/json` 패키지를 통해 간단하게 수행할 수 있습니다.

구조체를 정의하고, `json.Unmarshal` 함수를 사용하여 JSON 데이터를 디코딩하면 됩니다.

JSON 태그를 활용하여 필드 매핑을 조정할 수 있으며, 배열 형태의 JSON 데이터도 쉽게 처리할 수 있습니다.

이러한 기능을 통해 Go 언어는 JSON 데이터와의 상호작용을 매우 효율적으로 처리할 수 있습니다.

작성자: 김유빈 [비회원] | 작성일자: 1년 전 2024-09-19 01:50:40
조회수: 160 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.