【Go常见错误】6. JSON错误之Marshal后为空(1)

概述

在使用json的时候,常见的一个错误,就是结构体在Marshal后输出为空。

案例

首先定义一个point结构体:

type point struct {
  x float32
  y float32
}

然后创建一个point实例,并使用标准的json.Marshal函数把该实例编码成一个JSON输出:

p := point{3.0, 2.5}
b, err := json.Marshal(p) //①
if err != nil {
  return err
}
fmt.Println(string(b)) //②

① Marshal p

② b是一个[]byte变量,我们需要把它转换成可读的字符创。

不幸的的,上面的输出是空:

{}

可能原因

1.是因为结构体中没有设置JSON的标签吗?

type point struct {
  x float32 `json:"x"` //①
  y float32 `json:"y"` //②
}

2.是因为该结构体不是公有的吗?

type Point struct {
  x float32
  y float32
}

3.是因为该结构体内部的字段不是公有的吗?

type point struct {
  X float32
  Y float32
}

分别测试一下:

1和2还是输出空 {}

只有3输出了

{"x": 3, "Y": 2.5}

因此,要进行marshaled/unmarshaled,结构体的字段必须被导出(定义为公有)

拓展

在Marshal时,如果我们想忽略一些字段该怎么办呢?

有两种方法:

1、不导出这些字段,即让字段名的首字母小写;

2、使用JSON标签。即使用 “-” ;

type Foo struct {
  A string
  b string //方法1
  C string `json:"-"` //方法2
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Go语言中,判断结构体是否为可以通过判断结构体的各个字段是否为来实现。对于使用`json.Unmarshal`解析后的结构体,你可以通过判断其中的字段是否为其零值来确定结构体是否为。以下是一个示例代码: ```go package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` } func IsEmptyStruct(s interface{}) bool { // 将结构体转换为JSON字符串 jsonStr, _ := json.Marshal(s) // 判断JSON字符串是否为 return string(jsonStr) == "{}" } func main() { // 示例1:结构体 var p1 Person fmt.Println("Is p1 empty?", IsEmptyStruct(p1)) // 示例2:非结构体 p2 := Person{Name: "Alice", Age: 30, Email: "alice@example.com"} fmt.Println("Is p2 empty?", IsEmptyStruct(p2)) } ``` 在上述代码中,我们定义了一个`Person`结构体,并实现了一个`IsEmptyStruct`函数来判断结构体是否为。函数内部先将结构体转换为JSON字符串,然后判断该JSON字符串是否为。如果JSON字符串为字符串`{}`,则说明结构体为;否则,结构体不为。 在示例中,我们分别创建了一个结构体`p1`和一个非结构体`p2`,并通过调用`IsEmptyStruct`函数来判断它们是否为。 请注意,这种方法只能判断结构体中的字段是否为,不能判断结构体中的嵌套结构体是否为。如果需要判断嵌套结构体的空值,可以递归地对嵌套结构体进行判断。同时,结构体的零值和空值的定义可能因字段类型的不同而不同,需要根据实际情况进行判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值