gpt4 book ai didi

map - 解码到 map

转载 作者:IT王子 更新时间:2023-10-29 02:17:25 26 4
gpt4 key购买 nike

如何将数据解码到 map 中?

JSON 是一个对象列表,我想在解码期间将其转换为 map 。但是,似乎初始化 map 会创建一个未正确返回的新对象。

type foo struct {
Id string `json:"id"`
Name string `json:"name"`
}

type fooList []*foo
type fooMap map[string]*foo

func (f fooMap) UnmarshalJSON(data []byte) error {
f := fooMap{} // required since map is not initialized

var results fooList
if err := json.Unmarshal(data, &results); err != nil {
return err
}

for i := 0; i < len(results); i++ {
result := results[i]
f[result.Id] = result
}

return nil
}

我已经检查以确保没有错误,并且映射在 Unmarshal 函数的末尾包含正确的值,但是当我查看结果应该被解码到的对象时,它是空的。以下是我解码父对象的方式,父对象是包含 fooMap 的结构片段。

type bar struct {
Foos fooMap `json:"foos"`
}

type bars []*bar

...

var results bars
if err := json.Unmarshal(data, &results); err != nil {
return err
}

// here results contains a single bar item (which is correct) but the Foos
// property does not exist at all

我还尝试将 Foos 更改为 *fooMap 类型,然后将解码函数更新为 func (f *fooMap) UnmarshalJSON(... ) 但是解码函数永远不会被调用。

最佳答案

这看起来非常复杂,这里有几个令人困惑的部分。

  • 在 UnmarshalJSON 期间你真的需要中介 fooList 吗?这使得 json 表示看起来与您定义的类型不同,一开始我确实感到困惑。
  • 至少在这里,没有理由为所有内容定义您自己的类型,这使得代码很难阅读,因为它将结构隐藏在另一层间接之后。

所以你的问题的症结在于 fooMap 方法没有指针接收器。这使得无法从您的方法中将非零映射分配给接收器。您确实需要一个指针接收器,您需要在每个索引操作中取消引用它。在您的代码中,您只是将 map 数据结构分配给接收器的临时副本(我可能会以一种无效的方式添加)。

func (f *fooMap) UnmarshalJSON(data []byte) error {
*f = make(map[string]*foo) // required since map is not initialized

var results fooList
if err := json.Unmarshal(data, &results); err != nil {
return err
}

for i := 0; i < len(results); i++ {
result := results[i]
(*f)[result.Id] = result
}

return nil
}

根据我对您的 json 的最佳猜测:http://play.golang.org/p/WbwZJxphTj

关于map - 解码到 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22818208/

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