programing

Go에서 JSON을 구문 분석할 때 기본값을 지정하는 방법

telecom 2023. 2. 24. 13:16
반응형

Go에서 JSON을 구문 분석할 때 기본값을 지정하는 방법

Go에서 JSON 개체를 구문 분석하지만 지정되지 않은 필드의 기본값을 지정합니다.예를 들어 다음과 같은 구조 유형이 있습니다.

type Test struct {
    A string
    B string
    C string
}

A, B 및 C 기본값은 각각 "a", "b" 및 "c"입니다.즉, json을 해석할 때 다음과 같이 됩니다.

{"A": "1", "C": 3}

구조물을 입수하고 싶다.

Test{A: "1", B: "b", C: "3"}

내장 패키지를 사용하여 이것이 가능합니까?encoding/json아니면 이 기능을 가진 Go 라이브러리가 있나요?

이것은 encoding/json을 사용하여 가능합니다.콜할 때json.Unmarshal, 빈 구조체를 지정할 필요는 없습니다.기본값이 있는 구조체를 지정할 수 있습니다.

예:

var example []byte = []byte(`{"A": "1", "C": "3"}`)

out := Test{
    A: "default a",
    B: "default b",
    // default for C will be "", the empty value for a string
}
err := json.Unmarshal(example, &out) // <--
if err != nil {
    panic(err)
}
fmt.Printf("%+v", out)

이 예제를 실행하면{A:1 B:default b C:3}.

당신이 볼 수 있듯이.json.Unmarshal(example, &out)JSON의 마샬을 해제하다outJSON에서 지정된 값을 덮어쓰지만 다른 필드는 변경되지 않습니다.

리스트나 지도를 가지고 있는 경우Test승인된 답변은 더 이상 가능하지 않지만 UnmarshalJ를 사용하여 쉽게 확장할 수 있습니다.SON 방식:

func (t *Test) UnmarshalJSON(data []byte) error {
  type testAlias Test
  test := &testAlias{
    B: "default B",
  }

  err := json.Unmarshal(data, test)
  if err != nil {
      return err
  }

  *t = Test(*test)
  return nil
}

UnmarshalJ에 대한 재귀 콜을 방지하기 위해 testAlias가 필요합니다.SON. 새 유형에는 메서드가 정의되어 있지 않기 때문에 이 방법은 사용할 수 있습니다.

https://play.golang.org/p/qiGyjRbNHg

또, 다음의 기능을 실장할 수도 있습니다.UnmarshalJSONinterface에서 기본값을 설정합니다.

func (test *Test) UnmarshalJSON(data []byte) error {
    test.A = "1"
    test.B = "2"
    test.C = "3"

    type tempTest Test
    return json.Unmarshal(data, (*tempTest)(test))
}

종류tempTest필요하기 때문에UnmarshalJSON는 재귀적으로 호출되지 않습니다.

json.UnmarshalChristian과 JW의 답변처럼 단순하고 깔끔하지만 단점도 있습니다.

  • 먼저 필드의 기본값을 구문 분석 로직과 강하게 관련짓습니다.사용자 코드가 디폴트를 설정하도록 할 수 있습니다.현재로서는 마샬링을 해제하기 전에 디폴트를 설정할 필요가 있습니다.
  • 두 번째 단점은 단순한 경우에만 작동한다는 것입니다.옵션 구조체에 다른 구조체의 슬라이스 또는 맵이 있는 경우 기본값을 이 방법으로 채울 수 없습니다.

다른 옵션은 포인터 필드가 있는 기본값입니다.

    type Test struct {
        A *string
        B *string
        C *string
    }

    js := []byte(`{"A": "1", "C": "3"}`)

    var t Test
    if err := json.Unmarshal(js, &t); err != nil {
        fmt.Println(err)
    }

    if t.B == nil {
        var defaultB = "B"
        t.B = &defaultB
    }

언급URL : https://stackoverflow.com/questions/30445479/how-to-specify-default-values-when-parsing-json-in-go

반응형