현대 프로그래밍 언어의 데이터 구조 및 네트워크 전송에 대한 요구 사항이 점점 더 높아짐에 따라 JSON 형식도 중요한 데이터 교환 형식이 되었습니다. JSON은 데이터를 더 잘 전송할 수 있으며 Go 언어는 고성능과 간단한 애플리케이션 인터페이스로 인해 점점 더 대중화되고 있습니다. Go에서는 JSON 직렬화를 사용자 정의하여 데이터 전송 요구 사항을 더 잘 충족할 수 있습니다. 이 문서에서는 Go에서 사용자 정의 JSON 직렬화를 사용하는 방법을 살펴보겠습니다.
1. JSON 직렬화란?
JSON 직렬화란 객체를 JSON 형식의 문자열로 변환하여 네트워크 전송 중에 다른 서비스나 클라이언트로 전송하여 객체를 성공적으로 읽고 사용할 수 있도록 하는 것을 말합니다. 직렬화된 JSON 문자열에서 각 속성 이름은 문자열로 변환되고, 각 값은 서로 다른 언어 간의 범용 데이터를 보장하기 위해 JSON의 해당 유형으로 변환됩니다.
2. Go의 JSON 직렬화
Go 언어에서는 표준 라이브러리의 'encoding/json'을 사용하여 JSON 직렬화를 구현할 수 있습니다. 데이터 구조가 일반 구조이고 별도의 값인 경우 표준 라이브러리의 Marshal 함수를 직접 사용하여 아래와 같이 해당 JSON 문자열로 변환할 수 있습니다.
type User struct { Username string `json:"username"` Password string `json:"password"` } func main() { user := User{"Amy", "123456"} jsonStr, err := json.Marshal(user) if err != nil { panic(err) } fmt.Println(string(jsonStr)) }
출력 JSON 문자열은
{"username":"Amy","password":"123456"}
Three , 사용자 정의 JSON 직렬화
Go 언어에서는 MarshalJSON 및 UnmarshalJSON 메서드를 구현하여 JSON 직렬화를 사용자 정의할 수 있습니다. MarshalJSON 메서드는 구조나 유형을 JSON 문자열로 변환하는 데 사용되는 반면 UnmarshalJSON은 JSON 문자열을 해당 구조나 유형으로 변환할 수 있습니다.
사용자 정의 JSON 직렬화를 구현하기 전에 여러 구조 태그를 이해해야 합니다.
다음으로 급여를 예로 들어 사용자 정의 JSON 직렬화를 구현합니다.
type Salary struct { Basic int `json:"basic,omitempty"` Bonus int `json:"bonus,omitempty"` } func (s Salary) MarshalJSON() ([]byte, error) { var result string if s.Bonus != 0 { result = fmt.Sprintf(""basic":%d,"bonus":%d", s.Basic, s.Bonus) } else { result = fmt.Sprintf(""basic":%d", s.Basic) } return []byte("{" + result + "}"), nil } func main() { salary := Salary{ Basic: 10000, Bonus: 5000, } jsonStr, err := json.Marshal(salary) if err != nil { panic(err) } fmt.Println(string(jsonStr)) }
위 코드를 실행하면 출력 JSON 문자열은 다음과 같습니다.
{"basic":10000,"bonus":5000}
여기서 Marshal에서는 Bonus 필드가 0이 아닌 경우에만 해당 값이 출력됩니다. 0이면 이 필드는 출력되지 않습니다.
4. 사용자 정의된 JSON 형식
Go 언어에서는 MarshalText 및 UnmarshalText 메서드를 구현하여 JSON 형식을 사용자 정의할 수도 있습니다. MarshalText 메서드는 구조나 유형을 []바이트 형식의 텍스트로 변환하는 데 사용되는 반면, UnmarshalText는 []바이트 형식의 텍스트를 해당 구조나 유형으로 변환할 수 있습니다.
날짜를 예로 들어 JSON 형식 지정 기능을 맞춤설정하고 '2022-09-21'과 유사한 형식을 출력합니다.
type Date struct { time.Time } func (d Date) MarshalText() ([]byte, error) { return []byte(d.Time.Format("2006-01-02")), nil } func (d *Date) UnmarshalText(text []byte) error { parse, err := time.Parse("2006-01-02", string(text)) if err != nil { return err } d.Time = parse return nil } func main() { date := Date{time.Now()} jsonStr, err := json.Marshal(date) if err != nil { panic(err) } fmt.Println(string(jsonStr)) var newDate Date err = json.Unmarshal([]byte(""2022-09-21""), &newDate) if err != nil { log.Fatal(err) } fmt.Println(newDate.Time) }
위 코드를 실행하면 출력 JSON 문자열은 다음과 같습니다.
"2022-09-21" 2022-09-21 00:00:00 +0000 UTC
위 예에서 볼 수 있듯이 JSON 직렬화 및 역직렬화를 사용자 정의할 때 JSON 직렬화의 원리와 표준 라이브러리 구현을 이해해야 합니다. 실제 개발에서 유연하게 활용해보세요. 동시에, 우리는 다양한 시나리오에서 데이터 전송 요구 사항을 더 잘 충족할 수 있는 기본 도구와 지원을 제공하는 자체 개체에 대한 요구 사항을 충족하는 JSON 형식 지정 방법을 정의할 수도 있습니다.
위 내용은 Go에서 사용자 정의 JSON 직렬화를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!