gpt4 book ai didi

json - 将 json.RawMessage 转换为结构的正确方法是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:05:34 29 4
gpt4 key购买 nike

我有这个结构

type SyncInfo struct {
Target string
}

现在我从 ElasticSearch 查询一些 json 数据。 Sourcejson.RawMessage 类型。我想要的只是将 source 映射到我创建变量 mySyncInfoSyncInfo

我什至想出了如何做到这一点……但这似乎很奇怪。我首先调用 MarshalJSON() 来获取一个 []byte,然后将其提供给 json.Unmarshal() ,它需要一个 [ ]byte 和指向我的结构的指针。

这很好用,但感觉好像我在做一个额外的跳跃。我是否遗漏了什么,或者这是从 json.RawMessagestruct 的预期方式?

var mySyncInfo SyncInfo

jsonStr, _ := out.Hits.Hits[0].Source.MarshalJSON()
json.Unmarshal(jsonStr, &mySyncInfo)

fmt.Print(mySyncInfo.Target)

最佳答案

如前所述,json.RawMessage 的底层类型是 []byte,因此您可以使用 json.RawMessage 作为 json.Unmarshal 的数据参数。

但是,您的问题是您有一个指针 (*json.RawMessage) 而不是一个值。您所要做的就是取消引用它:

err := json.Unmarshal(*out.Hits.Hits[0].Source, &mySyncInfo)

工作示例:

package main

import (
"encoding/json"
"fmt"
)

type SyncInfo struct {
Target string
}

func main() {
data := []byte(`{"target": "localhost"}`)
Source := (*json.RawMessage)(&data)

var mySyncInfo SyncInfo
// Notice the dereferencing asterisk *
err := json.Unmarshal(*Source, &mySyncInfo)
if err != nil {
panic(err)
}

fmt.Printf("%+v\n", mySyncInfo)
}

输出:

{Target:localhost}

Playground : http://play.golang.org/p/J8R3Qrjrzx

关于json - 将 json.RawMessage 转换为结构的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255456/

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