为了账号安全,请及时绑定邮箱和手机立即绑定

JSON解码器无法将对象解码为对象

JSON解码器无法将对象解码为对象

Go
繁星淼淼 2022-10-17 16:00:09
type MiddleMan struct {    User CompletedByUser `json:"user"`}type CompletedByUser struct {    DisplayName string `json:"displayName"`    Id          string `json:"id"`}使用以下类型,我运行代码shorterJsonString := `{    "user":{        "displayName":null,        "id":"a03dfee5-a754-4eb9"    } }`if !json.Valid([]byte(shorterJsonString)) {    log.Println("Not valid")}var middleMan models.MiddleMannewReader := strings.NewReader(shorterJsonString)json.NewDecoder(newReader).Decode(&middleMan)log.Println(middleMan)不幸的是,对于嵌套对象,解码器似乎被破坏了。打印出来的不是吐出实际的物体,而是打印出来{{ a03dfee5-a754-4eb9 }}它似乎将整个事物展平到 id 字段中。这里发生了什么?
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您期望会发生什么/被打印出来?

log包(使用fmt包)打印用大括号括起来的结构,列出用空格分隔的字段值。

MiddleMan有一个字段,所以它看起来像这样:

{field}

field另一个struct类型在哪里CompletedByUser,它有 2 个字段,所以它看起来像这样:

{{field1 field2}}

wherefieldstring类型是空字符串,因此您会看到field2前缀为空格的值:

{{ a03dfee5-a754-4eb9}}

如果您打印它添加字段名称:

log.Printf("%+v", middleMan)

您将看到如下输出:

{User:{DisplayName: Id:a03dfee5-a754-4eb9}}

使用另一种(Go 语法)格式:

log.Printf("%#v", middleMan)

输出:

main.MiddleMan{User:main.CompletedByUser{DisplayName:"", Id:"a03dfee5-a754-4eb9"}}

在Go Playground上试试这个。


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信