MST
星途 面试题库

面试题:Go的json包处理复杂类型的最佳实践

给定一个JSON数组,数组中的元素类型不定,可能是字符串、数字、布尔值、对象或者数组。请用Go的encoding/json包实现一个函数,该函数能够正确地将这个JSON数组反序列化,并将其中所有数字类型的元素求和返回,写出详细的代码实现。
48.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "encoding/json"
    "fmt"
)

func sumNumbersInJSONArray(data []byte) (float64, error) {
    var result float64
    var v interface{}
    if err := json.Unmarshal(data, &v); err != nil {
        return 0, err
    }
    switch value := v.(type) {
    case []interface{}:
        for _, item := range value {
            sum, err := sumItem(item)
            if err != nil {
                return 0, err
            }
            result += sum
        }
    default:
        return 0, fmt.Errorf("input is not a JSON array")
    }
    return result, nil
}

func sumItem(item interface{}) (float64, error) {
    switch value := item.(type) {
    case float64:
        return value, nil
    case []interface{}:
        var result float64
        for _, subItem := range value {
            sum, err := sumItem(subItem)
            if err != nil {
                return 0, err
            }
            result += sum
        }
        return result, nil
    case map[string]interface{}:
        var result float64
        for _, subItem := range value {
            sum, err := sumItem(subItem)
            if err != nil {
                return 0, err
            }
            result += sum
        }
        return result, nil
    default:
        return 0, nil
    }
}

你可以使用以下方式调用这个函数:

func main() {
    jsonData := []byte(`[1, 2, "abc", true, {"key": 3}, [4, 5]]`)
    sum, err := sumNumbersInJSONArray(jsonData)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Sum:", sum)
    }
}