MST
星途 面试题库

面试题:Go语言中JSON序列化与反序列化的常见问题及解决方法

在Go语言中进行JSON序列化与反序列化时,经常会遇到结构体字段名称与JSON键不匹配、嵌套结构处理等问题。请举例说明如何解决结构体字段名称首字母大写导致JSON序列化后键名不一致的问题,以及如何处理嵌套结构体的JSON反序列化?
41.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

解决结构体字段名称首字母大写导致JSON序列化后键名不一致的问题

在Go语言中,结构体字段如果首字母大写才会在包外可见,而JSON序列化默认使用结构体字段名作为键名。可以通过结构体标签(struct tag)来指定JSON序列化后的键名。

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    p := Person{
        Name: "John",
        Age:  30,
    }
    data, err := json.Marshal(p)
    if err != nil {
        fmt.Println("Marshal error:", err)
        return
    }
    fmt.Println(string(data))
}

在上述代码中,Person结构体的NameAge字段使用结构体标签json:"name"json:"age",这样在JSON序列化时,键名会是nameage,而不是NameAge

处理嵌套结构体的JSON反序列化

假设有如下嵌套结构体:

package main

import (
    "encoding/json"
    "fmt"
)

type Address struct {
    City  string `json:"city"`
    State string `json:"state"`
}

type Employee struct {
    Name    string  `json:"name"`
    Age     int     `json:"age"`
    Address Address `json:"address"`
}

func main() {
    jsonData := `{
        "name": "Alice",
        "age": 25,
        "address": {
            "city": "New York",
            "state": "NY"
        }
    }`
    var emp Employee
    err := json.Unmarshal([]byte(jsonData), &emp)
    if err != nil {
        fmt.Println("Unmarshal error:", err)
        return
    }
    fmt.Printf("Name: %s, Age: %d, City: %s, State: %s\n", emp.Name, emp.Age, emp.Address.City, emp.Address.State)
}

在上述代码中,Employee结构体包含一个嵌套的Address结构体。在反序列化时,只要JSON数据的结构与结构体定义匹配,Go语言的json.Unmarshal函数就能正确地将JSON数据填充到嵌套结构体中。注意,嵌套结构体的字段同样要遵循首字母大写(或使用结构体标签)的规则才能正确反序列化。