使 marshar 从字符串失败

Make marshar fail from string

是否可以在接收到一些字符串后使 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)
}

我一直在努力,但没有成功。

来自Godocs

Channel, complex, and function values cannot be encoded in JSON. Attempting to encode such a value causes Marshal to return an UnsupportedTypeError.

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

您可以为 objobj 中的特定字段实施 json.Marshaler。此封送拆收器可以检查字段的值和 return 错误。这是一个为 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() 而不是尝试编组项目本身。