MST

星途 面试题库

面试题:Go json解析错误处理的优化

假设你有一个复杂的JSON数据结构,其中包含嵌套的对象和数组,在使用encoding/json包解析时,如何在错误处理方面进行优化,以确保即使部分数据解析失败,也能尽可能多地获取有效信息,同时清晰地定位错误位置?请结合代码示例说明。
40.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用json.DecoderDecode方法并配合自定义结构体
    • 定义一个与JSON数据结构对应的嵌套结构体。
    • 使用json.DecoderDecode方法进行解析,这样可以在遇到错误时获取更多上下文信息。
    • 对于可能失败的解析部分,可以使用interface{}类型来接收,然后在后续进行二次解析。
    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    type Outer struct {
        Inner1 Inner `json:"inner1"`
        Inner2 Inner `json:"inner2"`
        Extra  interface{} `json:"extra"`
    }
    
    type Inner struct {
        Field1 string `json:"field1"`
        Field2 int    `json:"field2"`
    }
    
    func main() {
        jsonData := []byte(`{
            "inner1": {
                "field1": "value1",
                "field2": 123
            },
            "inner2": {
                "field1": "value2",
                "field2": "not an integer"
            },
            "extra": "extra data"
        }`)
    
        var outer Outer
        decoder := json.NewDecoder(bytes.NewReader(jsonData))
        if err := decoder.Decode(&outer); err != nil {
            var syntaxError *json.SyntaxError
            var unmarshalTypeError *json.UnmarshalTypeError
    
            switch {
            case errors.As(err, &syntaxError):
                fmt.Printf("Syntax error at byte offset %d\n", syntaxError.Offset)
            case errors.As(err, &unmarshalTypeError):
                fmt.Printf("Type error at field %q, offset %d\n", unmarshalTypeError.Field, unmarshalTypeError.Offset)
            default:
                fmt.Printf("Other error: %v\n", err)
            }
        }
    
        fmt.Printf("Inner1: %+v\n", outer.Inner1)
        // 尝试对extra进行二次解析
        extraData, ok := outer.Extra.(string)
        if ok {
            fmt.Printf("Extra data: %s\n", extraData)
        }
    }
    
  2. 解析过程说明
    • 在上述代码中:
      • 定义了OuterInner结构体来匹配JSON数据结构。
      • Outer结构体中的Extra字段使用interface{}类型来接收可能无法直接解析为特定类型的数据。
      • 使用json.NewDecoder创建解码器并调用Decode方法进行解析。
      • 在错误处理部分,通过errors.As来判断错误类型,如果是json.SyntaxError可以获取语法错误的字节偏移量;如果是json.UnmarshalTypeError可以获取类型错误的字段名和偏移量,从而清晰定位错误位置。
      • 对于Extra字段,后续可以根据实际情况进行二次解析,这里简单地将其转换为string类型并打印。这样即使部分数据(如inner2field2解析失败),也能获取到inner1extra的有效信息。