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의 마샬을 해제하다out
JSON에서 지정된 값을 덮어쓰지만 다른 필드는 변경되지 않습니다.
리스트나 지도를 가지고 있는 경우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
또, 다음의 기능을 실장할 수도 있습니다.UnmarshalJSON
interface에서 기본값을 설정합니다.
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.Unmarshal
Christian과 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
'programing' 카테고리의 다른 글
AngularJS - 이미지 "다운로드" 이벤트 (0) | 2023.03.01 |
---|---|
Angular에서의 양방향 데이터 바인딩JS 디렉티브 (0) | 2023.03.01 |
선택 옵션에 대한 값 속성을 설정하려면 어떻게 해야 합니까? (0) | 2023.02.24 |
material-ui 텍스트 필드 스타일링 방법 (0) | 2023.02.24 |
process.env 때문에 경고를 오류로 간주하고 있습니다.CI = 참입니다.컴파일 실패 (0) | 2023.02.24 |