sql - 如何以一种好的方式使用 SQL NULL 值和 JSON?

Int64String 等 Go 类型不能存储空值, 所以我发现我可以使用 sql.NullInt64和 sql.NullString为此。

但是当我在 Struct 中使用这些时, 并使用 json 从 Struct 生成 JSON包裹, 那么格式与我使用常规 Int64String 类型时的格式不同。

JSON 有一个额外的级别,因为 sql.Null*** 也是一个 Struct。

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

最佳答案

sql.NullInt64 之类的类型不对 JSON 编码或解码进行任何特殊处理,因此适用默认规则。由于该类型是一个结构,它被编码为一个对象,其字段作为属性。

解决此问题的一种方法是创建您自己的实现 json.Marshaller/json.Unmarshaler 接口(interface)的类型。通过嵌入 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

https://stackoverflow.com/questions/33072172/

相关文章:

python - 将字符串键转换为字典中的 int

php - 如何限制 JSON 访问?

c# - Json.NET:反序列化嵌套字典

java - Spring :返回@ResponseBody "ResponseEntity

json - JSON 格式的 Amazon S3 响应?

java - Jackson 的@JsonView、@JsonFilter 和 Spring

java - 错误未检查调用 'put(K, V)' 作为原始类型 'java.util.HashM

json - 修改来自 Spring Boot Rest Controller 的默认 JSON 错

json - 使用 UTF-8 编码的 Jackson ObjectMapper?

python - 类型错误 : b'1' is not JSON serializable