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

如何很好地使用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



 类似资料:
  • 什么会导致方法停止工作? 最后一页总是与第一页相反的顺序,怎么会呢?

  • 目前,要用CompletionStage的集合做一些简单的事情,需要跨越几道丑陋的关卡: 我想写的是: 关于完成未来并转换为数组和连接的整个仪式都是样板文件,分散了对实际代码语义的注意力。 可能有一个版本的allOf()返回< code>Future 我可以自己尝试实现XXXUtil,但我想知道是否已经有一个成熟的3rdparty库来解决这个问题和类似的问题(例如Spotify的Completab

  • 问题内容: 我想将浮点数表示为四舍五入到一定位数的字符串,并且从不使用指数格式。本质上,我想显示任何浮点数并确保它“看起来不错”。 这个问题有几个部分: 我需要能够指定有效位数。 有效位数必须是可变的,而字符串格式化运算符不能做到这一点。[编辑]我已经改正了;字符串格式化操作符可以做到这一点。 我需要将其四舍五入到一个人期望的方式,而不是像1.999999999999 我想出了一种方法来完成此任务

  • 问题内容: 我想在Linux命令行上回显查找的文件名部分。我尝试使用以下内容: 和 以及转义和引用文本各个部分的其他组合。结果是该路径未被剥离: 为什么不? 更新:尽管我在下面有一个可行的解决方案,但我仍然对为什么“基本名称”没有执行应做的事情感兴趣。 问题答案: 您最初尝试的麻烦: 是代码在执行命令之前执行一次。单曲的输出是因为它是文件名的基本名称。因此,由find执行的命令是: 为找到的每个文

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