2 回答
TA贡献1772条经验 获得超6个赞
创建一个类似如下的类型:
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条经验 获得超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 关注
- 69 浏览
添加回答
举报