当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将json.RawMessage转换为结构的正确方法是什么?》经验,为你挑选了1个好方法。

我有这个 struct

type SyncInfo struct {
    Target string
}

现在我json从ElasticSearch 查询一些数据.Source是类型的json.RawMessage.我想要的只是映射source到我SyncInfo为其创建的变量mySyncInfo.

我甚至想出了如何做到这一点......但这看起来很奇怪.我首先调用MarshalJSON()get a []byte然后将json.Unmarshal()其作为[]byte一个指向我结构的指针.

这工作正常,但感觉好像我正在做一个额外的跳.我错过了什么,或者是从a json.RawMessage到a 的预定方式struct

var mySyncInfo SyncInfo

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

fmt.Print(mySyncInfo.Target)

ANisus.. 27

如上所述,底层类型json.RawMessage[]byte,所以你可以使用a 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}

游乐场: http ://play.golang.org/p/J8R3Qrjrzx



1> ANisus..:

如上所述,底层类型json.RawMessage[]byte,所以你可以使用a 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}

游乐场: http ://play.golang.org/p/J8R3Qrjrzx


田田!你是男人!这是我去Go的第一天;-)
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有