让marshar从字符串中失败

问题描述 投票:0回答:2

收到一些字符串后,是否有可能在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)
}

我一直试图成功,但没有成功。

go marshalling
2个回答
1
投票

您可以为json.Marshalerobj中的特定字段实现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()而不是试图编组项目本身。


0
投票

来自Godocs

通道,复杂和函数值无法以JSON编码。尝试编码此类值会导致Marshal返回UnsupportedTypeError。

因此,如果您要修改结构以包含任何这些类型并尝试编组它,那么您将收到错误。

© www.soinside.com 2019 - 2024. All rights reserved.