使用 niljson 处理 Go 语言中 JSON 的空值类型

news/2024/9/29 13:23:31

使用 niljson 处理 Go 语言中 JSON 的空值类型

原创 源自开发者 源自开发者
 
源自开发者
专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。
321篇原创内容

在使用Go语言进行JSON数据的序列化和反序列化时,经常会遇到一个问题:如何优雅地处理JSON中的可空字段?对于 intfloat64bool 等基础类型,它们的值可以是 0 或者 null,这在Go语言中难以区分。虽然可以使用指针来表示可空性,但这又引入了空指针异常的风险。

niljson 包提供了一种简单而高效的方式来解决这个问题,它定义了一系列可空类型,可以无缝地处理JSON序列化和反序列化过程中的可空字段,从而使你的Go应用程序能够更自然地处理JSON数据,并减少对 nil 值的样板代码检查。

niljson 的核心功能

  • 可空类型:  niljson 提供了一系列可空类型,例如 NilStringNilIntNilFloatNilBool 等,可以方便地集成到现有的Go结构体中。
  • JSON 序列化和反序列化支持:  niljson 可以自动处理JSON字段的序列化和反序列化,将 null JSON值转换为Go语言中的 nil 或零值,反之亦然。
  • 轻量级:  niljson 的设计非常轻量级,不会使你的应用程序变得臃肿,也不会引入不必要的依赖关系,它只依赖于Go标准库。

niljson 使用示例

package main

import (
 "encoding/json"
 "fmt"
 "os"

 "github.com/wneessen/niljson"
)

type JSONType struct {
 Bool       niljson.NilBoolean  `json:"bool"`
 Float32    niljson.NilFloat32 `json:"float32,omitempty"`
 Float64    niljson.NilFloat64 `json:"float64"`
 Int        niljson.NilInt     `json:"int"`
 Int64      niljson.NilInt64   `json:"int64"`
 NullString niljson.NilString  `json:"nil"`
 String     niljson.NilString  `json:"string"`
}

func main() {
 data := []byte(`{
  "bool": true,
  "float32": null,
  "float64": 0,
  "int": 123,
  "int64": 12345678901234,
  "nil": null,
  "string": "test"
 }`)

 var example JSONType
 var output string
 if err := json.Unmarshal(data, &example); err != nil {
  fmt.Println("failed to unmarshal JSON:", err)
  os.Exit(1)
 }

 if example.Bool.NotNil() {
  output += fmt.Sprintf("Bool is: %t, ", example.Bool.Value())
 }
 if example.Float32.IsNil() {
  output += "Float 32 is nil, "
 }
 if example.Float64.NotNil() {
  output += fmt.Sprintf("Float 64 is: %f, ", example.Float64.Value())
 }
 if example.String.NotNil() {
  output += fmt.Sprintf("String is: %s", example.String.Value())
 }
 fmt.Println(output)

 data, err := json.Marshal(&example)
 if err != nil {
  fmt.Printf("failed to marshal JSON: %s", err)
  os.Exit(1)
 }
 fmt.Println(string(data))
}

深入理解 niljson

niljson 的实现原理非常简单,它为每一种基础类型都定义了一个对应的可空类型,例如 NilStringNilInt 等。这些可空类型都包含一个指针类型的字段,用于存储实际的值。

以 NilString 为例,它的定义如下:

type NilString struct {
  *string
}

NilString 包含一个 *string 类型的字段,当JSON字段的值为 null 时,*string 字段的值为 nil,否则,*string 字段指向实际的字符串值。

niljson 还为每一种可空类型都定义了一系列方法,用于判断值是否为 nil,获取实际的值等。

例如,NilString 类型定义了以下方法:

  • IsNil() bool: 判断值是否为 nil
  • NotNil() bool: 判断值是否不为 nil
  • Value() string: 获取实际的字符串值,如果值为 nil,则返回空字符串。

通过这些方法,我们可以方便地判断和处理JSON字段的可空性。

总结

niljson 提供了一种优雅的方式来处理Go语言中JSON数据的可空字段,它使用简单,功能强大,可以帮助我们编写更加健壮和易于维护的代码,是Go语言开发者处理JSON数据不可或缺的利器。

图片

文章精选

使用 Go 语言连接并操作 SQLite 数据库

Go语言官方团队推荐的依赖注入工具

替代zap,Go语言官方实现的结构化日志包

Go语言常见错误 | 不使用function option模式

必看| Go语言项目结构最佳实践

 

点击关注并扫码添加进交流群

图片

Golang · 目录
上一篇一款功能完备的 Go 语言 Web 服务器
阅读原文
阅读 236
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

在本地通过Docker安装MySQL并配置持久化

看前须知 这里使用Mac下的OrbStack代替Docker,都是命令行操作,除了可能出现的UI不同外没有任何区别。 拉取镜像 由于是Mac环境,所以优先使用arm64结构,关于是否支持所需架构,可以在Docker Hub上查,一般支持的都会写明。 这里搜索MySQL,进入官方镜像就可以在Overview的Qu…

Mistral 大语言模型

Mistral AI Mistral AI team Mistral AI 是一家销售人工智能产品的法国公司。它由 Meta Platforms 和 Google DeepMind 的前员工于 2023 年 4 月创立。该公司于 2023 年 10 月筹集了 3.85 亿欧元,2023 年 12 月估值超过 20 亿美元Mistral.AI 愿景与使命 我们是一个具有高科学标…

配置vscode中CC++编译环境

[非完全体]配置vscode中C&C++编译环境 参考文章链接在文末。 Win10系统。 本文可能不太适合完全小白的同学参考学习... 如果你在配置中遇到了什么问题,可以看一看,或许我能为你提供解决方案。 一、卸载VScode,删除之前的配置 这一步主要是因为本人之前一直在用vscode,但…

代码随想录day49 || 42、接雨水 84、柱状图中最大的矩形

42、接雨水func trap(height []int) int {// 双指针思路,按照列计算雨水高度,分别计算每一列左右高于当前高度的最高柱子高度,然后通过min(left, right) - height[i] 得出当前列的雨水体积var res intvar left, right intfor i:=1; i<len(height)-1; i++ {left, right = …

大规模实施 OKR 的成功经验

在大型组织中,通常很难制定和使用适当的 OKR。当然,你可以很快制定出一个周期、一年甚至更长时间的 OKR,但要制定出便于执行和衡量进展的 OKR,那就是另一回事了。 以下是我在制定好的 OKR 方面遇到的困难。背景故事 前段时间,我们将 OKR 引入了一个相当大的组织。我们培训…

DNF85 仿官复古版单机安装教程 + 虚拟机一键端

前言 今天给大家带来一款单机游戏的架设:地下城与勇士 85 仿官复古版单机安装。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。 如…

[编程笔记] 从 bcp 客户端收到一个对 colid 7 无效的列长度

最近在做一个工具改造,实现A库数据导B库的功能。今天遇到一个奇怪问题,“从 bcp 客户端收到一个对 colid 7 无效的列长度”。最近在做一个工具改造,实现A库数据导B库的功能。今天遇到一个奇怪问题,“从 bcp 客户端收到一个对 colid 7 无效的列长度”。代码是从A库执行SELEC…

基于SIR模型的疫情发展趋势预测算法matlab仿真

1.程序功能描述 基于SIR模型的疫情发展趋势预测算法.对病例增长进行SIR模型拟合分析,并采用模型参数拟合结果对疫情防控力度进行比较。整体思路为采用SIR微分方程模型,对疫情发展进行过程进行拟合。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序Opt…