2 回答

TA貢獻1772條經(jīng)驗 獲得超6個贊
創(chuàng)建一個類似如下的類型:
import (
"bytes"
"encoding/json"
"fmt"
)
// nullOK is a JSON OK literal
var nullOK = []byte("OK")
type ValueString struct {
Error string
Valid bool
}
// UnmarshalJSON implements json.Unmarshaler.
func (s *ValueString) UnmarshalJSON(data []byte) error {
if bytes.Equal(data, nullOK) {
s.Valid = true
return nil
}
if err := json.Unmarshal(data, &s.Error); err != nil {
return fmt.Errorf("checking OK: couldn't unmarshal JSON: %w", err)
}
s.Valid = false
return nil
}
// MarshalJSON implements json.Marshaler.
func (s ValueString) MarshalJSON() ([]byte, error) {
if s.Valid {
return []byte("OK"), nil
}
return json.Marshal(s.Error)
}
并在您的結構中使用它:
...
Value ValueString `json:"value"`
...
當值為“OK”時,您的將是 ,否則請檢查解析值。Value.ValidtrueValue.Error

TA貢獻1818條經(jīng)驗 獲得超3個贊
使用mkopriva的提示,我想我提出了使用和匿名結構的簡單概念驗證解決方案interface{}
package main
import "encoding/json"
import "fmt"
type Foo struct {
Value interface{} `json:"value"`
}
func main() {
v1 := Foo{Value: "version1"}
j1, _ := json.Marshal(v1)
fmt.Println(string(j1))
v2 := Foo{Value: struct {
Value string `json:"value"`
}{Value: "version2"}}
j2, _ := json.Marshal(v2)
fmt.Println(string(j2))
}
運行此命令會得到兩個輸出:
{"value":"version1"}
{"value":{"value":"version2"}}
- 2 回答
- 0 關注
- 83 瀏覽
添加回答
舉報