2 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個贊
string不能為零。如果您想?yún)^(qū)分缺席字段、null值和空值"",您可以使用以下選項(xiàng):
作為一種快速解決方案,您可以使用指針:
type Animal struct {
Name *string
}
缺點(diǎn)是您需要使用時間變量來設(shè)置此字段。
更靈活的解決方案是實(shí)現(xiàn)UnmarshalerAnimal 結(jié)構(gòu)的接口并使用 temporalmap[string]string進(jìn)行所需的檢查并返回錯誤:
type Animal struct {
Name string
}
func (a *Animal) UnmarshalJSON(data []byte) error {
m := map[string]interface{}{}
err := json.Unmarshal(data, &m)
if err != nil {
return err
}
// check if field is exist
name, exist := m["name"]
if !exist {
return fmt.Errorf("field 'name' should be present")
}
// check other fields...
// ...
// if all fields are ok, you can:
// 1. set fields from map items
a.Name = name
...
// 2. call Unmarshal
return json.Unmarshal(data, a)
}
這里的缺點(diǎn)是您需要“手動”檢查每個字段。
下一步是使用重型機(jī)械:go-swagger或go-openapi。這些工具使您能夠使用聲明性模式 (OpenAPI) 對 JSON 數(shù)據(jù)執(zhí)行檢查,您可以輕松實(shí)現(xiàn)版本控制、發(fā)布 API 等等。當(dāng)然,對于 3 字段結(jié)構(gòu)來說,它是過度工程化的。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個贊
您可以使用指針
type Animal struct {
Name *string
Age int
Zone int
}
或包裹
import "github.com/guregu/null"
type Animal struct {
Name null.String
Age int
Zone int
}
- 2 回答
- 0 關(guān)注
- 263 瀏覽
添加回答
舉報(bào)