如何使用JSON解组将内存地址转换为映射变量中的字符串值?

如何使用JSON解组将内存地址转换为映射变量中的字符串值?,json,go,Json,Go,我使用一个映射类型变量来序列化来自API的JSON POST响应,并在Go中使用它 使用字符串作为键,使用[]*json.RawMessage数组作为映射中值的类型 “act”和“key”是填充http.PostForm的函数参数。这是一个从main()调用的独立函数 以下是相关代码: resp, err := http.PostForm(api, url.Values{"API": {key}, "action": {act}}) if err != n

我使用一个映射类型变量来序列化来自API的JSON POST响应,并在Go中使用它

使用字符串作为键,使用[]*json.RawMessage数组作为映射中值的类型

“act”和“key”是填充http.PostForm的函数参数。这是一个从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显然能够将键“success”映射为数组值的内存地址表示形式,但数组值本身(嵌套对象的数组)没有显示

对指针变量本身的解组似乎没有任何错误。API返回一个JSON对象,其中包含一个键“success”,一个数组作为嵌套对象的值。我的目标是映射每个嵌套值并能够解析它

为了访问嵌套在数组中的值,是否还需要完成另一个步骤?如何将这些内存地址转换为它们所表示的实际值。JSON解组是否只支持对象而不支持JSON数组的映射

JSON解组是否只支持对象而不支持JSON数组的映射

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

该问题将JSON解码为指向JSON.RawMessage的指针片段的映射。打印输出显示指针的片段

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

for k, values := range objmap {
    for _, v := range values {
        fmt.Printf("%s: %s\n", k, *v) // note the * on this line
    }
}

A
json.RawMessage
是直接从json文档中获取的字节片段。必须再次解组才能获得Go值。使用字符串将
json.RawMessage
转换为
字符串

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
    }
}

.

我不需要整个JSON响应。只希望将解析后的数据显示给用户。