Golang 中空的切片转化成 JSON 后变为 null 的问题如何解决?

这篇具有很好参考价值的文章主要介绍了Golang 中空的切片转化成 JSON 后变为 null 的问题如何解决?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

问题

原因

小结


问题

在 Golang 中,经常需要将其他类型(例如 slice、map、struct 等类型)的数据转化为 JSON 格式。有时候转化的结果并不是预期中的,例如将一个空的切片转化为 JSON 时,会变成"null",而并非预期的"[]"。示例代码如下:

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var res []string

	b, err := json.Marshal(res)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(b))
}

运行示例看下结果:

$ go run main.go
null

结果输出的值为 “null”,而并非预期中的 “[]”。

原因

上面示例代码中的 res 是通过 var 关键字来声明为字符串类型切片的,这样的切片称为零值切片,其值为 nil,无指向任何内存地址。其出现实标题中这种情况的切片就是零值切片,接下来介绍下零值切片和空切片。

在 Golang 中,切片是一个长度可变的数组,有三个属性:指针、长度和容量。"零值切片"和"空切片"是两种特殊的切片。

  1. 零值切片:当一个切片类型的变量被声明但没有被显式初始化时,它的值就是一个零值切片。零值切片不会被分配内存空间,长度和容量都是零,零值切片也可以说是 nil 切片。例如:
var s []string
fmt.Println(s == nil)  // 输出 "true"
  1. 空切片:空切片的长度和容量也都是零,但是指向了一个真实的、虽然是空的,但已经分配了内存的数组。空切片可以通过 make 函数或者字面量语法来创建。例如:
s := make([]string, 0)
fmt.Println(s == nil)  // 输出 "false"
s := []string{}
fmt.Println(s == nil)  // 输出 "false"

在这两个例子中,s 都是空切片,长度和容量都是零,但是值不是 nil。

零值切片和空切片在大多数情况下是可以互换使用的,都可以用来表示一个空的集合。但是如果需要区分一个切片是否被显式初始化过,就需要注意它们的区别了。而 encoding/json 库对两者的处理方式就是不一样的,会将零值切片编码为“null”,而将空切片编码为 “[]”。这可能会在某些情况下引发问题,例如当接口对于数组的处理期望"[]"而非"null"时。

讲解到这里,相信大家已经知道本文题目的答案了,如果将空的切片转化为 JSON 格式后预期得到“[]”,就需要在声明切片时,使用 make 函数或者字面量语法来创建切片。看个简单的示例:

package main

import (
	"encoding/json"
	"fmt"
)

func main() {

	res := make([]string, 0)
	// 或者 res:= []string{}
	// 而非 var res []string

	b, err := json.Marshal(res)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(b))
}

运行代码看下效果:

$ go run main.go
[]

可以看出,达到了预期的效果。

小结

本文讲解了零值切片(nil 切片)和空切片的定义和差异,如果想将空的切片转化为 JSON 格式后得到 “[]”而不是“null”,最好的方式是使用 make 函数或者字面量语法来创建切片。文章来源地址https://www.toymoban.com/news/detail-731216.html

到了这里,关于Golang 中空的切片转化成 JSON 后变为 null 的问题如何解决?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang 卡码网55 右旋字符串 切片拷贝问题补充

    右旋字符串 55卡码网 关于go中切片的拷贝问题: 通过[:]的方式进行赋值的方式,如b:=a[:2],由于其共享底层的数组,所以说修改其中之一,另一个也是受影响的,为 浅拷贝 切片如果想要实现深拷贝,需要使用** copy **

    2024年01月22日
    浏览(36)
  • 如何把实体类对象转化为json(json转实体类对象)​

    使用fastjson框架解决实体类转json的问题(实体类要序列化哦,如  实体类  ) 1、序列化(实体类转json,text为json数据,user为实体类,JSON.toJSONString为固定写法) 2、反序列化(json转实体类,text为json数据,User为实体类,JSON.parseObject为固定写法) 点击下载jar

    2024年02月10日
    浏览(38)
  • 如何将JSON字符串转化成对象

    在这里只能使用ObjiectMapper这个类才能将Json字符串转成对象的格式进行输出 话不多说,直接上代码 注意事项: json字符串只能匹配上实体类里面定义的属性,没有被定义的属性是无法进行匹配赋值的

    2024年02月13日
    浏览(49)
  • JSON序列化与反序列化NULL值丢失问题

    做项目一般都会有一些特殊的需求,例如保留json中的null值,但是fastjson都会把null值得属性给过滤掉 json序列化保留null值 json反序列化保留null值 使用hutool的Json工具时

    2024年02月15日
    浏览(70)
  • 如何把利用paddlepaddle导出的json文件转化为yolo或者voc文件

    目录 1. 修改源码,让模型能够生成出对于单个图像的标注。 2. 把数据转为yolo格式 3.把yolo格式转化为xml格式 这两天想偷懒,想让模型先在数据上标一遍,然后我再做修正,主要是图个省事。由于我们主要是利用paddle,模型也是基于paddle推理的,因此即便我对paddle有一万个吐槽

    2024年02月07日
    浏览(44)
  • PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法

    在php开发中会遇到和他人对接接口,对方使用json传输数据,使用json_decode()函数却无法将json数据转换为数组。 先看封装的代码 这种对接post接口的封装方法一般是没有问题的,但是我们打印$res的时候,会发现只会返回NULL。而打印$response的时候,是可以返回json字符串的。我们

    2024年02月06日
    浏览(48)
  • golang无需创建新切片

    在 Go 语言中,`append(b, 0)[:len(b)]` 是一种常见的用法,用于在切片 `b` 后追加一个元素,并返回旧切片的前 `len(b)` 个元素。 这种用法的目的是将一个新元素追加到切片中,并确保切片的长度保持不变。具体步骤如下: 1. `append(b, 0)`:通过 `append` 函数将元素 `0` 追加到切片 `b`

    2024年02月11日
    浏览(38)
  • 使用WebMvcConfigurationSupport后导致原来返回的json数据变为了xml的解决方法

    未使用WebMvcConfigurationSupport拦截时返回的数据都是JSON格式,使用WebMvcConfigurationSupport做拦截后数据的返回变为了XML的格式。 在Spring框架中,WebMvcConfigurationSupport 是一个类,它可以用于自定义Spring MVC的配置。如果您在应用程序中使用了WebMvcConfigurationSupport,而且之前返回的JSO

    2024年02月13日
    浏览(43)
  • golang字符串切片去重

    函数的功能是从输入的字符串切片中去除重复的元素,并返回去重后的结果。具体的实现逻辑如下: 创建一个空的结果切片 result ,用于存储去重后的字符串。 创建一个临时的map tempMap ,用于存放不重复的字符串。map的键是字符串,值是字节类型。 遍历输入的字符串切片

    2024年02月12日
    浏览(40)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包