>백엔드 개발 >Golang >Go에서 사용자 정의 JSON 직렬화를 사용하는 방법은 무엇입니까?

Go에서 사용자 정의 JSON 직렬화를 사용하는 방법은 무엇입니까?

王林
王林원래의
2023-05-11 16:55:421376검색

현대 프로그래밍 언어의 데이터 구조 및 네트워크 전송에 대한 요구 사항이 점점 더 높아짐에 따라 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 직렬화를 구현하기 전에 여러 구조 태그를 이해해야 합니다.

  1. json: 구조를 정의할 때 필드 앞에 'json:"custom_name"'을 추가하여 직렬화에서 필드를 정의할 수 있습니다. 이름은 JSON입니다. 끈.
  2. omitempty: 필드 값이 비어 있지 않으면 직렬화 중에 필드가 포함되고, 필드가 비어 있으면 필드가 포함되지 않습니다.

다음으로 급여를 예로 들어 사용자 정의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.