gpt4 book ai didi

json - 当将 JSON 解码为 interface{} 时,它变成了不需要的类型,而是 map

转载 作者:行者123 更新时间:2023-12-03 10:10:11 25 4
gpt4 key购买 nike

当你我使用 json.Unmarshal对于具体类型,我按预期填充了我的值。
但是如果我通过 interface{}而不是 struct(为了更灵活),我得到 map .我该如何解决这个问题......或者它只是反模式,传递接口(interface)。
例子:

package main

import (
"encoding/json"
"fmt"
)

type Response struct {
Success bool `json:"success"`
Data []int64 `json:"data"`
}

func handlerWithInterface(request interface{}, response interface{}) (interface{}, error) {
var err error
// logic with request ....
fixture := []byte("{\"success\": true, \"data\": [20, 21, 22]}")

// assingned to interface
err = json.Unmarshal(fixture, &response)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal responses: %s", err.Error())
}

return response, nil
}

func handler(request interface{}, response Response) (interface{}, error) {
var err error
// logic with request ....
fixture := []byte("{\"success\": true, \"data\": [20, 21, 22]}")

err = json.Unmarshal(fixture, &response)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal responses: %s", err.Error())
}

return response, nil
}

func main() {
req := "some request"
resp := Response{}
result1, err := handlerWithInterface(req, resp)
if err != nil {
panic(err)
}
fmt.Println(result1)

result2, err := handler(req, resp)
if err != nil {
panic(err)
}
fmt.Println(result2)
}
输出: map[data:[20 21 22] success:true] {true [20 21 22]}

最佳答案

应用程序传递一个指向 interface{} 的指针。包含 Response值(value)。 json.Unmarshal函数通过指针遍历指向最后一个可设置值的接口(interface),interface{} .当目的地是 interface{} , json.Unmarshal 将 JSON 对象解码为 map[string]interface{} .
通过传递指向 resp 的指针来修复主要。通过此更改,解码函数将使用 resp是解码的目标。

resp := Response{}
result1, err := handlerWithInterface(req, &resp) // <-- add & on this line
不必取 response 的地址在 handlerWithInterface .从 main 传递指针一直到 json.Unmarshal .
func handlerWithInterface(request interface{}, response interface{}) (interface{}, error) {
var err error
// logic with request ....
fixture := []byte("{\"success\": true, \"data\": [20, 21, 22]}")

err = json.Unmarshal(fixture, response) // <-- remove & on this line
if err != nil {
return nil, fmt.Errorf("failed to unmarshal responses: %s", err.Error())
}

return response, nil
}

关于json - 当将 JSON 解码为 interface{} 时,它变成了不需要的类型,而是 map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65100543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com