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

如何以良好的方式使用SQL NULL值和JSON?

拓拔弘亮
2023-03-14
问题内容

像Go这样的类型Int64String并且不能存储null值,因此我发现可以为此使用sql.NullInt64和sql.NullString。

但是,当我在Struct中使用它们,并使用json包从Struct生成JSON时,格式与使用常规Int64String类型时不同。

JSON具有附加级别,因为sql.Null ***也是Struct。

有没有很好的解决方法,还是应该在我的SQL数据库中不使用NULL?


问题答案:

sql.NullInt64这样的类型不会对JSON封送或拆封实施任何特殊处理,因此适用默认规则。由于类型是结构,因此将其编组为对象,并将其字段作为属性。

解决此问题的一种方法是创建自己的实现json.Marshaller/
json.Unmarshaler接口的类型。通过嵌入sql.NullInt64类型,我们可以免费获得SQL方法。像这样:

type JsonNullInt64 struct {
    sql.NullInt64
}

func (v JsonNullInt64) MarshalJSON() ([]byte, error) {
    if v.Valid {
        return json.Marshal(v.Int64)
    } else {
        return json.Marshal(nil)
    }
}

func (v *JsonNullInt64) UnmarshalJSON(data []byte) error {
    // Unmarshalling into a pointer will let us detect null
    var x *int64
    if err := json.Unmarshal(data, &x); err != nil {
        return err
    }
    if x != nil {
        v.Valid = true
        v.Int64 = *x
    } else {
        v.Valid = false
    }
    return nil
}

如果您使用此类型代替sql.NullInt64,则应按预期进行编码。

您可以在此处测试此示例:http :
//play.golang.org/p/zFESxLcd-c



 类似资料:
  • 我在评估卡桑德拉。我正在使用datastax驱动程序和CQL。 我必须能够处理每秒至少1000个宽行插入,使用不同但数量很大(~1000)的名称/值对。 问题是:我编写了一个简单的基准测试,它执行1000个宽行插入,每个插入10000个名称/值对。我使用CQL和datastax驱动程序的性能非常慢,而不使用CQL的版本(使用astyanax)在相同的测试集群上有很好的性能。 我已经读过这个相关的问

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 我已经和我的一个朋友进行了很长的讨论,关于Java主方法的正确和正确使用。基本上我们有一个这样的类: 但是主要方法放在哪里?我认为“保留代码所属的位置”是一种好习惯,因此可以将上面的代码转换为 虽然我的伙伴认为“启动代码与应用程序本身

  • 问题内容: 像Go这样的类型,并且不能存储null值,因此我发现可以为此使用sql.NullInt64和sql.NullString。 但是,当我在Struct中使用它们,并使用json包从Struct生成JSON时,格式与使用常规和类型时不同。 JSON具有附加级别,因为sql.Null ***也是Struct。 有没有很好的解决方法,还是应该在我的SQL数据库中不使用NULL? 问题答案: 像

  • 问题内容: 在本地主机上。我有以下目录结构: 到的符号链接在哪里。基本上,这是因为我需要测试并安装多个WordPress,但是我不想移动插件并将其复制并粘贴到任何地方。 但是,有时我需要爬上目录树以包含配置文件: 该文件夹始终解析为: 即使插件正在执行并包含在其中 。 在PHP中是否可以通过在符号链接中执行的脚本将目录中的文件包含到目录中? 尽管此问题仅在我的测试服务器上发生,但我想拥有一个可安全

  • 我有一小段代码。我想用更好的方式写它,用更少的嵌套支票。我怎样才能实现呢? 有没有什么简洁的方法可以让我用Java 8重写上面的代码呢?

  • 问题内容: 我正在寻找Angular的CRUD通用工厂(我目前更喜欢使用服务): 对于我所有的实体,此代码将大致相同。是否可以注入实体名称(或相应的RESTful路径),如果可以,可以将其视为局部类,如果需要其他承诺(例如遍历导航属性),也可以注入它们? 如果可以使用Angular做到这一点,有人可以发布一些示例吗? 问题答案: 就我个人而言,我希望代码保持干燥状态,并且发现,如果在服务器API上