为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用JSON Unmarshal将内存地址转换为地图变量中的字符串值?

如何使用JSON Unmarshal将内存地址转换为地图变量中的字符串值?

Go
喵喵时光机 2022-08-24 20:27:34
我正在使用映射类型变量从API序列化我的JSON POST响应,并在Go中使用它。使用字符串作为键和 []*json。原始消息数组作为映射中值的类型。“act”和“key”是填充 http 的函数参数。后窗体。这是一个从 main() 调用的独立函数以下是相关代码:resp, err := http.PostForm(api, url.Values{"API": {key}, "action": {act}})if err != nil {    fmt.Printf("AN ERROR OCCURED!")    log.Fatal(err)}defer func(Body io.ReadCloser) {    err := Body.Close()    if err != nil {        log.Fatal(err)    }}(resp.Body)body, err := ioutil.ReadAll(resp.Body)if err != nil {    log.Fatal(err)}var objmap map[string][]*json.RawMessageerr = json.Unmarshal(body, &objmap)if err != nil {    log.Fatal(err)}fmt.Println(objmap)以下是我在zsh终端中收到的输出:地图[成功:[0xc00000e060 0xc00000e078 0xc00000e090]]Unmarshal显然能够将关键“成功”与数组值的内存地址表示形式进行映射,但数组值本身(即嵌套对象的数组)未显示。指针变量本身的 Unmarshal 似乎没有任何错误。API 返回单个 JSON 对象,其中包含一个键“success”,一个数组作为具有嵌套对象的值。我的目标是映射每个嵌套值并能够解析它。是否需要完成另一个步骤才能访问数组中嵌套的值?如何将这些内存地址转换为它们所表示的实际值。JSON Unmarshal 是否不支持 JSON 数组的映射,只支持对象?
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

JSON Unmarshal 是否不支持 JSON 数组的映射,只支持对象?


encoding/json Unmarshal 函数支持所有 JSON 实体,包括数组。Unmarshal 文档描述了如何将 JSON 实体映射到 Go 值。


该问题将 JSON 解码为指向 json 的指针切片的映射。原始消息。打印的输出显示指针切片。


使用取消引用运算符取消引用切片中的指针:*


for k, values := range objmap {

    for _, v := range values {

        fmt.Printf("%s: %s\n", k, *v) // note the * on this line

    }

}

A 是直接从 JSON 文档获取的字节切片。您必须再次取消元帅才能获得 Go 值。使用字符串转换将 a 转换为 :json.RawMessagejson.RawMessagestring


for k, values := range objmap {

    for _, v := range values {

        s := string(*v) // * dereferences pointer, string() converts to string

        fmt.Printf("%s: %s\n", k, s)

    }

}

指针不是必需的。像这样简化代码:


var objmap map[string][]json.RawMessage // * removed on this line

err := json.Unmarshal(body, &objmap)

if err != nil {

    log.Fatal(err)

}

fmt.Println(objmap)

for k, values := range objmap {

    for _, v := range values {

        fmt.Printf("%s: %s\n", k, v) // ... and this line

    }

}


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号