json - 为嵌入式结构使用自定义 JSON Marshal() 的问题

标签 json struct go

我正在尝试定义一个自定义 JSON 编码(marshal)拆收器来以特定格式显示一些时间信息。理想情况下,我希望有一个结构来存储创建/修改的值,然后将它们嵌入到需要跟踪该信息的结构中。此外,我想在 JSON 编码(marshal)拆收器中定义自定义日期格式,以供客户端应用程序使用。

我目前有两个结构

type Timestamp struct {
    Created time.Time
    Modified time.Time
}

type Company struct {
    Id string
    Name string
    Timestamp    
}

我想将时间戳结构嵌入到需要在项目更新/创建时记录的对象中。那里没有什么疯狂的。

当我定义时我的问题就来了

func (t Timestamp) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        CreatedFormatted string
    }{
        CreatedFormatted: t.Created.Format("Monday Jan _2 15:04:05 2006"),
    })
}

当我去编码 Company 时,我只看到时间戳的 json,但没有看到公司的信息。我本以为会显示 Company 结构 Timestamp 结构的内容。我在这里做错了什么吗?

最佳答案

当嵌入到结构中的类型提供方法时,该方法成为嵌入结构的一部分。自 Company嵌入 Timestamp , TimestampMarshalJSON适用于 Company以及。当 json 正在寻找编码 Company 时它看到它有一个 MarshalJSON方法并调用它——它找到的方法只编码时间戳字段。结构的默认行为(将每个字段编码到 JSON 对象中它自己的键中)被覆盖。

你可以做什么:

  1. 不要使用结构嵌入,只需要 Timestamp常规字段(即使您将其声明为 Timestamp Timestamp )。那么Company不会继承它的方法,JSON 将按预期工作(但代码中期望嵌入的其他部分可能会发生变化)。或者:
  2. Company它自己的MarshalJSON编码所有字段(包括时间戳)的方法。你可以通过
    一个。将字段复制到与 Company 相同的不同类型但没有嵌入和编码。
    b.将字段复制到 map 中并对其进行编码。
    C。独立编码每个字段并粘贴字符串 fmt.Sprintf(<code>{"key1":%s,"key2":%s,...}</code>, m1, m2, ...)你自己。

关于json - 为嵌入式结构使用自定义 JSON Marshal() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702630/

相关文章:

c - __attribute__((packed)) 对嵌套结构数组的影响?

swift - 只有第一个添加到结构的项目被上传到 firebase

c++ - 怎么能不对 C++ 结构布局做出假设呢?

go - 在golang中将网络掩码号转换为32位

go - 什么是 npm-outdated 的 Go(mod)等价物?

javascript - javascript对象序列化为JSON字符串的问题

php - 如何在多维 JSON 数组中显示值

json - 解码 JSON 映射,其中 key 是非内置类型

go - 在为发布构建 Go 程序时,仅使用 'go build' 是标准做法吗?

java - 从 iOS 远程处理到 Java/Spring 后端