Golang中如何将JSON反序列化到结构体?
Golang中如何将JSON反序列化到结构体? 大家好。
这是我的结构体
type Form struct {
Key string `json:"key"`
Label string `json:"label"`
Type string `json:"type"`
NotNull bool `json:"notNull"`
Enums []Enum `json:"enums"`
Custom *Form `json:"custom"`
}
这是JSON数据
{
"key": "schoolInfo",
"placeHolder": "",
"label": "school Info",
"type": "Custom",
"notNull": false,
"enums": [],
"custom": [
{
"key": "departmentId",
"placeHolder": "",
"label": "Department",
"type": "Id",
"notNull": false,
"enums": [],
"custom": [],
"tags": []
},
{
"key": "studentId",
"placeHolder": "",
"label": "Student Id",
"type": "String",
"notNull": false,
"enums": [],
"custom": [],
"tags": []
},
{
"key": "currentDegreeType",
"placeHolder": "",
"label": "DegreeType",
"type": "Enum",
"notNull": false,
"enums": [
{
"label": "BACHELOR",
"value": "BACHELOR"
},
{
"label": "MASTER",
"value": "MASTER"
},
{
"label": "DOCTOR",
"value": "DOCTOR"
},
{
"label": "SUCCESSIVE_POSTGRADUATE_AND_DOCTORAL",
"value": "SUCCESSIVE_POSTGRADUATE_AND_DOCTORAL"
},
{
"label": "FOREIGN_STUDENT",
"value": "FOREIGN_STUDENT"
},
{
"label": "COLLEGE_DEGREE",
"value": "COLLEGE_DEGREE"
}
],
"custom": [],
"tags": []
},
{
"key": "majorId",
"placeHolder": "",
"label": "Major",
"type": "Id",
"notNull": false,
"enums": [],
"custom": [],
"tags": []
},
{
"key": "grade",
"placeHolder": "",
"label": "Grade",
"type": "String",
"notNull": false,
"enums": [],
"custom": [],
"tags": []
},
{
"key": "estimatedGraduationTime",
"placeHolder": "",
"label": "",
"type": "Date",
"notNull": false,
"enums": [],
"custom": [],
"tags": []
},
{
"key": "departmentGrade",
"placeHolder": "",
"label": "",
"type": "String",
"notNull": false,
"enums": [],
"custom": [],
"tags": []
}
],
"tags": []
}
这是我用来将JSON反序列化到结构体的代码。
var form form_definition.Form
err := json.Unmarshal([]byte(aJson), &form)
if err != nil {
logrus.Error("Found err!")
println(err)
}else {
println(form.Key)
}
但是我遇到了一个错误。这个错误对我来说很奇怪 这是错误信息
time="2019-08-23T17:39:29+08:00" level=error msg="Found err!"
(0x531a80,0xc0000960a0)
当我将结构体修改为以下形式时,一切正常。
type Form struct {
Key string `json:"key"`
Label string `json:"label"`
Type string `json:"type"`
NotNull bool `json:"notNull"`
Enums []Enum `json:"enums"`
//Custom *Form `json:"custom"`
}
我的问题是如何将JSON转换为这个结构体? 谢谢大家。
更多关于Golang中如何将JSON反序列化到结构体?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
欢迎来到论坛!
听起来你已经解决了问题。关于 JSON 序列化还有其他疑问吗?
更多关于Golang中如何将JSON反序列化到结构体?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
抱歉。JSON自定义字段的类型是数组,但在我的结构体中,自定义字段不是数组类型。这就是我遇到错误的原因。
谢谢。关于JSON序列化我没有其他问题了。Go语言中序列化JSON的方式非常简单,我真的很喜欢Golang。我突然想起一个关于JSON序列化的问题:如何判断JSON的类型?我需要知道这个JSON是数组还是对象。您知道如何获取JSON的类型吗?再次感谢您。
问题出在结构体定义中的 Custom 字段类型与JSON数据不匹配。在JSON中,custom 字段是一个数组([]),但在结构体中定义为 *Form(指向单个 Form 的指针)。当JSON中的 custom 字段包含多个对象时,反序列化会失败。
需要将 Custom 字段的类型修改为切片 []Form 或 []*Form 来匹配JSON数组结构。以下是修正后的代码:
type Form struct {
Key string `json:"key"`
Label string `json:"label"`
Type string `json:"type"`
NotNull bool `json:"notNull"`
Enums []Enum `json:"enums"`
Custom []Form `json:"custom"` // 修改为切片类型
}
type Enum struct {
Label string `json:"label"`
Value string `json:"value"`
}
反序列化代码保持不变:
var form Form
err := json.Unmarshal([]byte(jsonData), &form)
if err != nil {
logrus.Error("Found err!")
println(err)
} else {
println(form.Key)
}
如果JSON中 custom 字段可能为null,可以使用指针切片:
type Form struct {
Key string `json:"key"`
Label string `json:"label"`
Type string `json:"type"`
NotNull bool `json:"notNull"`
Enums []Enum `json:"enums"`
Custom []*Form `json:"custom"` // 指针切片
}
这样修改后,JSON数据就能正确反序列化到结构体中。

