当前位置: 首页 > 编程笔记 >

golang:json 反序列化的[]和nil操作

西门正平
2023-03-14
本文向大家介绍golang:json 反序列化的[]和nil操作,包括了golang:json 反序列化的[]和nil操作的使用技巧和注意事项,需要的朋友参考一下

我就废话不多说了,大家还是直接看代码吧~

package main
import (
	"encoding/json"
	"log"
)
type JS struct {
	A []string
}
func main() {
	v1 := &JS{}
	v2 := &JS{A: []string{}}
	o1, err := json.Marshal(&v1)
	log.Println(string(o1), err)
	o2, err2 := json.Marshal(&v2)
	log.Println(string(o2), err2)
}

结果

2019/01/07 18:13:26 {"A":null} <nil>

2019/01/07 18:13:26 {"A":[]} <nil>

补充:go语言中 json转换--nil

go语言中如果一个变量的值为nil,是否能否为json?

如果能否转换,转换后的结果是什么?

下面直接看下例子。

package main
import (
    "encoding/json"
    "fmt"
)
func main() {
    marshalTest()
}
func marshalTest() {
  b, err := json.Marshal(nil)
  if err != nil {
    fmt.Println("json.Marshal failed:", err)
    return
  }
  fmt.Println("result:", string(b))
}

output:

result: null

结果输出为"null"。

也就是说,凡是值为nil的变量,经过json编码后都是"null"。例如,未赋值的指针变量、切片slice等:

var ptr *int

var s []int

反过来,如果一个json字符串是"null",经过解析后,转换后的值是什么样呢?

例如,转换为结构体,转换后为结构体变量的默认值。

package main
import (
    "encoding/json"
    "fmt"
)
func main() {
    unmarshalTest()
}
type Apple struct {
    Size int
    Addr string
    Num *int
}
func unmarshalTest() {
    value := []byte("null")
    a := Apple{}
    if err := json.Unmarshal(value, &a); err != nil {
        fmt.Println("json.Unmarshal failed:", err)
        return
    }
    fmt.Printf("result:%+v\n", a)
}

output:

result:{Size:0 Addr: Num:<nil>}

如果"null"作为json字符串,转换为slice后,值为[]。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持小牛知识库。如有错误或未考虑完全的地方,望不吝赐教。

 类似资料:
  • 本文向大家介绍详解PHP中的序列化、反序列化操作,包括了详解PHP中的序列化、反序列化操作的使用技巧和注意事项,需要的朋友参考一下 数据(变量)序列化(持久化) 将一个变量的数据"转换为"字符串,但并不是类型转换,目的是将该字符串存储在本地。相反的行为成为反序列化。 流程: 具体实例: 1.在xxx1.php中进行序列化操作 2.在xxx2.php中进行反序列化操作 以上就是本文的全部内容,希望对

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加

  • 问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行:

  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器