为了账号安全,请及时绑定邮箱和手机立即绑定

使 marshar 从字符串失败

使 marshar 从字符串失败

Go
一只斗牛犬 2023-03-29 17:19:46
收到一些字符串后,是否有可能使 marshall 在 getJSONStr 函数中失败?package mainimport (   "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)}我一直在努力做到这一点,但没有成功。
查看完整描述

2 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您可以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()它们而不是尝试编组项目本身。



查看完整回答
反对 回复 2023-03-29
?
郎朗坤

TA贡献1921条经验 获得超9个赞

Channel、complex 和 function 值不能用 JSON 编码。尝试对此类值进行编码会导致 Marshal 返回 UnsupportedTypeError。

因此,如果您要修改您的结构以包含这些类型中的任何一种并尝试对其进行编组,您将收到错误消息。


查看完整回答
反对 回复 2023-03-29
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信