覆盖 json.Marshal 使用的布局来格式化 time.Time

2023-11-26

在Golang中,有没有办法使通用encoding/jsonMarshal 在编组时使用不同的布局time.Time fields?

基本上我有这个结构:

s := {"starttime":time.Now(), "name":"ali"}

我想使用编码为 jsonencdoding/json's Marshal功能,但我想使用我的自定义布局,我想象在某个地方time.Format(layout)正在被调用,我想控制该布局,


受到 zeebo 答案的启发并在该答案的评论中进行了讨论:

http://play.golang.org/p/pUCBUgrjZC

package main

import "fmt"
import "time"
import "encoding/json"

type jsonTime struct {
    time.Time
    f string
}

func (j jsonTime) format() string {
    return j.Time.Format(j.f)
}

func (j jsonTime) MarshalText() ([]byte, error) {
    return []byte(j.format()), nil
}

func (j jsonTime) MarshalJSON() ([]byte, error) {
    return []byte(`"` + j.format() + `"`), nil
}

func main() {
    jt := jsonTime{time.Now(), time.Kitchen}
    if jt.Before(time.Now().AddDate(0, 0, 1)) { // 1
        x := map[string]interface{}{
            "foo": jt,
            "bar": "baz",
        }
        data, err := json.Marshal(x)
        if err != nil {
            panic(err)
        }
        fmt.Printf("%s", data)
    }
}

这个解决方案embeds将 time.Time 放入 jsonTime 结构中。嵌入将所有 time.Time 的方法提升为 jsonTime 结构,允许在没有显式类型转换的情况下使用它们(请参阅 // 1)。

嵌入 time.Time 的缺点是还会提升 MarshalJSON 方法,出于向后兼容性的原因,encoding/json 编组代码优先级高于 MarshalText 方法(MarshalText 是在 Go 1.2 中添加的,MarshalJSON 早于此)。因此,使用默认的 time.Time 格式而不是 MarshalText 提供的自定义格式。

为了解决这个问题,我们重写 jsonTime 结构的 MarshalJSON。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖 json.Marshal 使用的布局来格式化 time.Time 的相关文章

随机推荐

  • 为什么Java的类型推断这么弱?

    说吧 我有一个方法 public static
  • 如何在oracle数据库中存储BigInteger值

    我已经使用 JDBC 将 Java 程序连接到 Oracle 数据库 我想存储BigInteger数据库中的值 512 位 列的类型应该是什么 我正在尝试这样 我在数据库中获取了一列数字类型 我转换了BigInteger to BigDec
  • 如何在 Swift 中将 url.query 转换为字典?

    我有一个进入 AppDelegate 方法的 URL func application application UIApplication open url URL sourceApplication String annotation A
  • 与在 Rhino Mocks 中使用 Ordered() 等效的 AAA 语法是什么

    我一生都无法找到使用 Rhino 中的 Fluent AAA 语法来验证操作顺序的正确语法 我知道如何使用旧的学校记录 播放语法来做到这一点 MockRepository repository new MockRepository usin
  • Capybara + RSpec 仅在控制器规格中看到空白页。为什么?

    我正在尝试为一个简单的控制器编写控制器规范 但是 Capybara 看不到任何页面内容 但是 在我的浏览器中查看该网站的页面效果很好 我究竟做错了什么 谢谢 我的控制器规格 我的spec helper rb 我的宝石文件 您需要明确告诉您的
  • JavaScript 颜色渐变

    使用带或不带 Jquery 的 javascript 我需要根据开始和结束颜色创建颜色渐变 这可以通过编程来完成吗 结束颜色只会是开始颜色的较暗阴影 并且它用于无序列表 我无法控制 li 项目的数量 我正在寻找一种解决方案 允许我选择开始和
  • C# 事件处理程序

    如何在 C 中检查 Button Click 事件是否有关联的处理程序 If button Click null 抛出编译错误 你不能 事件只是公开 添加处理程序 和 删除处理程序 仅此而已 事实上 在 CLR 中 您还可以使用元数据将方法
  • 如何使用 google API for python 在特定文件夹下创建工作表?

    我可以在 我的云端硬盘 的根目录中使用以下代码创建一个工作表 但是如何在 我的云端硬盘 或 共享云端硬盘 的文件夹下创建该工作表 from googleapiclient discovery import build service bui
  • 如何在代码中设置绑定?

    我需要在代码中设置绑定 我似乎无法弄清楚 这是我尝试过的 XAML
  • wpf 中的弹出窗口和切换按钮交互

    我有一个包含切换按钮和弹出窗口的控件 单击 ToggleButton 时 会出现弹出窗口 当 ToggleButton 未选中时 弹出窗口应关闭 此外 单击远离弹出窗口应导致其关闭 并导致切换按钮取消选中 我通过将 Popup 的 Stay
  • 如何在 CKeditor 上传中向 POST 值添加字段

    I use django and ckeditor为 TextEdits 提供所见即所得的品味 我想使用CKEditor文件上传功能 在文件浏览器 图像对话框中 但是CKEditor上传图像的POST只包含文件数据 这是 CSRF 检查的一
  • 从 Linq 查询调用方法

    我正在使用 Linq 查询和调用方法 Like oPwd objDecryptor DecryptIt c Password ToString 它将返回空值 意味着这不会起作用 我如何解决这个问题 Thanks var q from s i
  • 过滤以特定关键字开头的字符串列表

    我怎样才能找到一个字符串 PartialWord 在列表 WordList 在 Python 2 7 中 PartialWord ab WordList absail rehab dolphin 使用通配符进行搜索 例如 ab 如果它以这些
  • Android TextView 对齐文本

    如何获取 a 的文本TextView是否合理 文本在左侧和右侧齐平 我找到了一个可能的解决方案here 但它不起作用 即使您将vertical center更改为center vertical等 我不相信 Android 支持完全合理 更新
  • MS Access 错误“ODBC——调用失败。转换规范的字符值无效 (#0)”

    有谁知道这个错误意味着什么或如何解决它 我使用的是 Access 2003 和 SQL2005 当尝试在特定子表单上添加记录时会出现它 Microsoft SQL Native Client 转换规范的字符值无效 0 此 MS 错误报告描述
  • 从另一个应用程序以编程方式打开 iOS 设置应用程序中的键盘设置屏幕

    我们如何以编程方式直接进入 iOS 设置应用程序的以下任何屏幕 UPDATE 正如其他用户指出的那样 此解决方案不再适用于 iOS10 如果有人知道如何使其在 iOS10 中运行 请告诉我们 iOS 要打开 您自己的应用程序的 设置 您可以
  • 运行 mocha 测试时 Babel 意外导入令牌

    其他相关问题中提供的解决方案 例如在 babelrc 中包含适当的预设 es2015 已在我的项目中实现 我有两个项目 我们称它们为 A 和 B 它们都使用 ES6 模块语法 在项目 A 中 我导入项目 B 该项目通过 npm 安装并位于
  • SQLite 与使用数字的表名有关的问题?

    我正在开发一个应用程序 它要求用户选择这样格式的年份1992 1993来自旋转器 表名也被命名为1992 1993这个想法是使用 SQL 通过这样的语句提取该表中的值选择 1992 1993 但是 当我运行模拟器时 它会抛出错误 如果我随后
  • 使用 Zend Framework 和 PHP 发送电子邮件

    我正在制作一个表单 当用户输入他们的电子邮件帐户并单击发送时 一封电子邮件将发送到他们的电子邮件帐户 我已经把一切都解决了 只是它不会将电子邮件发送到我的帐户 有人有主意吗 是否有我遗漏的配置或其他什么 这是我的控制器的示例 public
  • 覆盖 json.Marshal 使用的布局来格式化 time.Time

    在Golang中 有没有办法使通用encoding jsonMarshal 在编组时使用不同的布局time Time fields 基本上我有这个结构 s starttime time Now name ali 我想使用编码为 jsonen