MST
星途 面试题库

面试题:Go语言json包处理复杂嵌套与自定义标签及接口的技巧

定义一个接口TypeA,有一个方法Do()。再定义一个嵌套结构体,外层结构体Outer包含一个Inner结构体数组,Inner结构体有一个字段实现TypeA接口,且Inner结构体和Outer结构体都有自定义的json标签。请实现将包含这个嵌套结构体的实例序列化为JSON字符串的功能,要求在序列化过程中,能够正确处理自定义标签和接口字段。同时实现反序列化功能,将JSON字符串正确反序列化为嵌套结构体实例,在反序列化时,如果遇到不合法的JSON格式或者接口实现类型不匹配等错误,能够进行优雅的错误处理并返回详细错误信息。
29.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "encoding/json"
    "fmt"
)

// 定义接口TypeA
type TypeA interface {
    Do()
}

// 实现TypeA接口的结构体
type ImplTypeA struct{}

func (i *ImplTypeA) Do() {
    fmt.Println("ImplTypeA Do method")
}

// Inner结构体
type Inner struct {
    A TypeA `json:"a"`
}

// Outer结构体
type Outer struct {
    InnerList []Inner `json:"inner_list"`
}

// 序列化函数
func Serialize(outer *Outer) (string, error) {
    data, err := json.MarshalIndent(outer, "", "  ")
    if err != nil {
        return "", err
    }
    return string(data), nil
}

// 反序列化函数
func Deserialize(jsonStr string) (*Outer, error) {
    var outer Outer
    err := json.Unmarshal([]byte(jsonStr), &outer)
    if err != nil {
        return nil, err
    }
    // 检查接口实现类型是否匹配
    for _, inner := range outer.InnerList {
        if _, ok := inner.A.(*ImplTypeA);!ok {
            return nil, fmt.Errorf("interface implementation type mismatch")
        }
    }
    return &outer, nil
}

你可以这样调用这些函数:

func main() {
    // 创建实例
    outer := Outer{
        InnerList: []Inner{
            {A: &ImplTypeA{}},
        },
    }

    // 序列化
    jsonStr, err := Serialize(&outer)
    if err != nil {
        fmt.Println("Serialize error:", err)
        return
    }
    fmt.Println("Serialized JSON:", jsonStr)

    // 反序列化
    deserializedOuter, err := Deserialize(jsonStr)
    if err != nil {
        fmt.Println("Deserialize error:", err)
        return
    }
    fmt.Println("Deserialized Outer:", deserializedOuter)
}
  1. 接口定义:首先定义了TypeA接口,它有一个Do方法。
  2. 结构体定义:定义了ImplTypeA结构体来实现TypeA接口。同时定义了Inner结构体和Outer结构体,并给它们的字段加上了自定义的json标签。
  3. 序列化函数Serialize函数使用json.MarshalIndentOuter结构体序列化为格式化的JSON字符串。
  4. 反序列化函数Deserialize函数使用json.Unmarshal将JSON字符串反序列化为Outer结构体。并且在反序列化后检查接口实现类型是否匹配,如果不匹配则返回错误。
  5. 主函数:在main函数中,创建了一个Outer结构体实例,调用序列化和反序列化函数,并处理可能出现的错误。