收到一些字符串后,是否有可能在getJSONStr函数内使marshall失败?
package main
import (
"fmt"
"encoding/json"
)
type obj struct {
Name string `json:"name"`
}
func getJSONStr(s string) (*string, error) {
t := new(obj)
t.Name = s
b, err := json.Marshal(t)
if err != nil {
return nil, err
}
str := string(b)
return &str, nil
}
func main() {
str, err := getJSONStr("VALIDATE")
fmt.Println("str",*str)
fmt.Println("err",err)
}
我一直试图成功,但没有成功。
您可以为json.Marshaler
或obj
中的特定字段实现obj
。此封送程序可以检查字段的值并返回错误。这是一个为Name
字段添加了自定义封送器的示例,如果Name
是"Boom!"
则会失败
type NameWithValidation string
func (s NameWithValidation) MarshalJSON() ([]byte, error) {
if string(s) == "Boom!" {
return nil, fmt.Errorf("Name '%s' failed validation", s)
}
return json.Marshal(string(s))
}
type obj struct {
Name NameWithValidation `json:"name"`
}
当编组时,json.Marshal()
检查该类型是否实现了json.Marshaler
,如果这是真的,它会调用MarshalJSON()
而不是试图编组项目本身。
来自Godocs
通道,复杂和函数值无法以JSON编码。尝试编码此类值会导致Marshal返回UnsupportedTypeError。
因此,如果您要修改结构以包含任何这些类型并尝试编组它,那么您将收到错误。