当前位置: 首页 > 面试题库 >

我可以使用MarshalJSON向golang中的json编码添加任意字段吗?

苏胤
2023-03-14
问题内容

假设我已经编写了以下代码段。在操场上的完整代码在这里为那些倾斜。

type Book struct {
  Title        string
  Author       string
}

func main() {
  ms := Book{"Catch-22", "Joseph Heller"}
  out, err := json.MarshalIndent(ms, "", "  ")
  if err != nil {
    log.Fatalln(err)
  }
  fmt.Println(string(out))
}

这段代码完全按照我的期望输出以下内容:

{
  "Title": "Catch-22",
  "Author": "Joseph Heller"
}

假设我想将字段添加到JSON输出中而不将其包含在Book结构中。也许是一个体裁:

{
  "Title": "Catch-22",
  "Author": "Joseph Heller",
  "Genre": "Satire"
}

我可以使用MarshalJSON()将任意字段添加到上的JSON有效载荷Marshal()吗?就像是:

func (b *Book) MarshalJSON() ([]byte, error) {
    // some code
}

其他答案使我认为这应该可行,但是我正在努力弄清实现方式。


问题答案:

这是比我上一个更好的答案。

type FakeBook Book

func (b Book) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        FakeBook
        Genre string
    }{
        FakeBook: FakeBook(b),
        Genre:    "Satire",
    })
}

由于匿名结构字段是“合并的”(有一些其他注意事项),我们可以使用它来避免重新映射各个字段。请注意,使用该FakeBook类型可以避免发生无限递归。

游乐场:http:
//play.golang.org/p/21YXhB6OyC



 类似资料:
  • 问题内容: 我想创建一个结构,其中一个字段可以举行一些特殊类型的,比如说的数据,和。我想将此结构从JSON解码/编码。我们如何在go / golang中实现这一目标? 例如,我具有以下定义的结构: 哪里是 假设我需要将以下JSON解组到上述struct中: 还有这个: 而且这个还: 我该如何实现? 我可以自己定义并继续实现吗? 还是有一种定义自定义类型的方法,例如说并定义为 然后定义并继续? 我也

  • 问题内容: 如果在Golang中取消编组时,如果在json中找不到字段,是否可能会产生错误?我在文档中找不到它。是否有任何标记指定所需的字段? 问题答案: 程序包中没有将字段设置为“必需”的标签。您要么必须编写自己的方法,要么对缺少的字段进行后期检查。 要检查缺少的字段,您将必须使用指针以区分缺失/空值和零值: 完整的工作示例: 操场

  • 我在Netty上运行的项目有以下场景: 我有一个绑定到“w”的服务器通道 我基本上需要一个现有通道的bind('w','z')方法,它将从'z'获取连接并将其包含在我现有的管道中,而不是转到已经绑定在'w'的服务器通道 这在Netty中可能吗? 我能想到的一个(脏)解决方案是单独存储这些绑定请求,然后当我的服务器获得相应的连接时,它只会创建一个“转发”处理程序,将所有内容转发到我的其他通道。Net

  • 问题内容: 我将json字符串存储到mysql中的文本字段中。插入后,我想更新我的json字符串,并使用jackson json将mysql行ID添加到其中。 我有一个Json格式的Java字符串 我希望添加另一个K / V,而无需编写代码行。 终于有了这个: 我可以将String转换为JsonNode: 想要做这样的事情 然后在mysql中使用新的json字符串在我的文本字段中更新 我做不到 我

  • 我将json字符串存储到MySQL中的文本字段中。插入之后,我希望更新我的json字符串,并使用jackson json将mysql行id添加到其中。 我有一个Json格式的java字符串

  • 问题内容: 我已经编辑了package.json以自定义“开始”脚本,因此它将–debug标志添加到节点: 有没有一种方法可以添加新脚本,例如调试脚本,该脚本可以执行我自定义的“开始”现在正在执行的操作? 我希望能够执行: 问题答案: 在您的package.json中定义脚本 然后您可以使用npm的运行脚本 或更短的版本