Go에서 파생 스칼라 유형에 대해 UnmarshalJSON을 구현하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-26 18:41:16
원래의
389명이 탐색했습니다.

How to Implement UnmarshalJSON for Derived Scalar Types in Go?

Go에서 파생 스칼라에 대한 UnmarshalJSON 구현

문제:
하위 유형의 정수 상수를 변환하는 사용자 정의 유형 문자열로 변환하거나 그 반대로 변환하려면 JSON 문자열을 자동으로 역마샬링해야 합니다. UnmarshalJSON은 구조체를 사용하지 않고 스칼라 값을 수정하는 방법을 제공하지 않기 때문에 이는 어려운 작업입니다.

해결책:
파생 스칼라 유형에 대해 UnmarshalJSON을 구현하려면 다음 단계를 고려하세요. :

포인터 사용 수신자:
수신자의 값을 수정하려면 UnmarshalJSON 메서드에 대한 포인터 수신기를 사용합니다.

문자열로 역마샬링:
JSON 텍스트를 일반 문자열, 모든 JSON 인용을 제거합니다.

조회 및 설정 값:
조회 함수를 사용하여 문자열 값을 기반으로 해당 PersonID를 검색합니다. 결과를 수신기에 할당합니다.

예:

func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}
로그인 후 복사

코드 예:

package main

import (
    "encoding/json"
    "fmt"
)

type PersonID int

const (
    Bob PersonID = iota
    Jane
    Ralph
    Nobody = -1
)

var nameMap = map[string]PersonID{
    "Bob":    Bob,
    "Jane":   Jane,
    "Ralph":  Ralph,
    "Nobody": Nobody,
}

var idMap = map[PersonID]string{
    Bob:    "Bob",
    Jane:   "Jane",
    Ralph:  "Ralph",
    Nobody: "Nobody",
}

func (intValue PersonID) Name() string {
    return idMap[intValue]
}

func Lookup(name string) PersonID {
    return nameMap[name]
}

func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}

type MyType struct {
    Person   PersonID `json: "person"`
    Count    int      `json: "count"`
    Greeting string   `json: "greeting"`
}

func main() {
    var m MyType
    if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
        fmt.Println(err)
    } else {
        for i := 0; i < m.Count; i++ {
            fmt.Println(m.Greeting, m.Person.Name())
        }
    }
}
로그인 후 복사

출력:

Hello Ralph
Hello Ralph
Hello Ralph
Hello Ralph
로그인 후 복사

위 내용은 Go에서 파생 스칼라 유형에 대해 UnmarshalJSON을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿