Go에서 JSON 직렬화와 역직렬화는 어떻게 하나요?
_____A1: Go에서는 `encoding/json` 패키지의 `json.Marshal` 함수를 사용합니다. 예를 들어,
```go
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
jsonData, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(jsonData)) // 출력: {"Name":"Alice","Age":30}
}
```
Q2: Go에서 JSON 역직렬화(JSON 문자열 → Struct)는 어떻게 하나요?
A2: `encoding/json` 패키지의 `json.Unmarshal` 함수를 사용합니다. 예를 들어,
```go
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
jsonData := []byte(`{"Name":"Alice","Age":30}`)
var p Person
err := json.Unmarshal(jsonData, &p)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%+v\n", p) // 출력: {Name:Alice Age:30}
}
```
Q3: JSON 필드 이름과 Go 구조체 필드 이름을 다르게 지정하려면?
A3: 구조체 필드에 `json` 태그를 활용합니다.
```go
type Person struct {
Age int `json:"age"`
}
```
이렇게 하면 JSON의 `name` 필드가 `FullName` 필드에 매핑됩니다.
Q4: JSON 직렬화 시 특정 필드를 생략하거나 옵션을 부여하려면?
A4: `json` 태그에서 옵션을 줄 수 있습니다. 예:
- `omitempty`: 빈 값일 경우 해당 필드를 JSON에 포함하지 않음
- `-`: 해당 필드를 JSON 직렬화/역직렬화에서 완전히 제외
예:
```go
type Person struct {
Name string `json:"name,omitempty"`
Age int `json:"-"`
}
```
Q5: JSON 역직렬화 시 알 수 없는 필드는 어떻게 되나요?
A5: 기본적으로 무시됩니다. 에러가 발생하지 않고, 구조체에 정의된 필드만 매핑됩니다.
Q6: JSON 직렬화/역직렬화 시 에러는 어떻게 처리하나요?
A6: `json.Marshal`과 `json.Unmarshal` 모두 반환값으로 `error`를 줍니다. 반드시 에러 체크를 해야 합니다.
Q7: JSON 배열을 Go 슬라이스/배열로 처리하려면?
A7: 슬라이스 변수에 매핑하면 됩니다. 예:
```go
jsonData := []byte(`[{"Name":"Alice"},{"Name":"Bob"}]`)
var people []Person
err := json.Unmarshal(jsonData, &people)
```
Q8: JSON 인코딩 시 들여쓰기(strftime) 등의 포맷을 원할 때는?
A8: `json.MarshalIndent` 함수를 사용합니다. 예:
```go
jsonData, err := json.MarshalIndent(p, "", " ")
```
Q9: Go에서 JSON 직렬화/역직렬화 시 익명 필드나 중첩 구조체는 어떻게 처리되나요?
A9: 중첩 구조체는 JSON 중첩 객체 형태로 매핑됩니다. 익명 필드는 포함되어 상속처럼 작동합니다.
Q10: JSON을 interface{} 타입으로 역직렬화 하면?
A10: JSON의 타입 구조에 맞게 Go의 기본 타입(map[string]interface{}, []interface{}, string, float64 등)으로 변환되며, 동적 데이터 처리에 사용됩니다.
예:
```go
var data interface{}
err := json.Unmarshal(jsonData, &data)
```
이후 타입 어서션 필요.
---
요약하자면, Go에서 JSON 직렬화/역직렬화는 `encoding/json` 패키지의 `json.Marshal` 및 `json.Unmarshal` 함수를 사용하며, 구조체 필드와 JSON 키 매핑을 위해 `json` 태그를 붙이고 에러 처리를 반드시 해야 합니다.
JSON은 데이터 교환 형식으로 널리 사용되며, Go 언어는 JSON 데이터를 쉽게 처리할 수 있는 기능을 제공합니다.
JSON 직렬화 직렬화는 Go의 데이터 구조체를 JSON 형식의 문자열로 변환하는 과정입니다.
이를 위해 `json.Marshal` 함수를 사용합니다.
다음은 직렬화의 예입니다.
```go package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { person := Person{Name: "Alice", Age: 30} // JSON으로 직렬화 jsonData, err := json.Marshal(person) if err != nil { fmt.Println("Error:", err) return } fmt.Println(string(jsonData)) // {"name":"Alice","age":30} } ``` 위의 예제에서 `Person` 구조체는 `Name`과 `Age` 필드를 가지고 있습니다.
`json:"name"`과 같은 태그를 사용하여 JSON에서의 필드 이름을 지정할 수 있습니다.
`json.Marshal` 함수는 `Person` 구조체의 인스턴스를 JSON 형식으로 변환합니다.
JSON 역직렬화 역직렬화는 JSON 형식의 문자열을 Go의 데이터 구조체로 변환하는 과정입니다.
이를 위해 `json.Unmarshal` 함수를 사용합니다.
다음은 역직렬화의 예입니다.
```go package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { jsonData := []byte(`{"name":"Bob","age":25}`) var person Person // JSON으로부터 역직렬화 err := json.Unmarshal(jsonData, &person) if err != nil { fmt.Println("Error:", err) return } fmt.Println(person.Name) // Bob fmt.Println(person.Age) // 25 } ``` 위의 예제에서는 JSON 문자열을 `[]byte` 형식으로 정의하고, `json.Unmarshal` 함수를 사용하여 이를 `Person` 구조체로 변환합니다.
역직렬화 과정에서 JSON의 필드 이름과 구조체의 태그가 일치해야 합니다.
JSON 처리 시 주의사항 1. 태그 사용 : JSON 필드 이름과 Go 구조체 필드 이름이 다를 경우, 태그를 사용하여 매핑할 수 있습니다.
태그는 `json:"fieldName"` 형식으로 작성합니다.
2. 내부 구조체 : 구조체 안에 다른 구조체를 포함할 수 있으며, 이 경우에도 태그를 사용하여 JSON 필드와 매핑할 수 있습니다.
3. 슬라이스와 맵 : JSON 배열은 Go의 슬라이스로, JSON 객체는 Go의 맵으로 쉽게 변환할 수 있습니다.
4. 에러 처리 : JSON 직렬화 및 역직렬화 과정에서 발생할 수 있는 에러를 항상 처리해야 합니다.
5. 비공식 필드 : 구조체의 필드가 대문자로 시작해야 JSON으로 직렬화할 수 있습니다.
소문자로 시작하는 필드는 패키지 외부에서 접근할 수 없기 때문에 JSON으로 변환되지 않습니다.
결론 Go에서 JSON 직렬화와 역직렬화는 `encoding/json` 패키지를 통해 간단하게 수행할 수 있습니다.
구조체와 JSON 간의 변환을 통해 데이터의 저장 및 전송을 쉽게 처리할 수 있으며, 다양한 데이터 구조를 지원합니다.
JSON을 다룰 때는 태그와 에러 처리를 적절히 활용하여 안정적인 코드를 작성하는 것이 중요합니다.
작성자:
이주희 [비회원]
| 작성일자: 1년 전
2024-09-19 01:50:35
조회수: 261 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 261 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.