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

4 回复

欢迎来到论坛!

听起来你已经解决了问题。关于 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数据就能正确反序列化到结构体中。

回到顶部