猿问

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

我正在使用映射类型变量从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.RawMessage

err = 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 数组的映射,只支持对象?


喵喵时光机
浏览 125回答 1
1回答

心有法竹

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.RawMessagestringfor 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 lineerr := 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    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答