如何使用JSON解组将内存地址转换为映射变量中的字符串值?
我使用一个映射类型变量来序列化来自API的JSON POST响应,并在Go中使用它 使用字符串作为键,使用[]*json.RawMessage数组作为映射中值的类型 “act”和“key”是填充http.PostForm的函数参数。这是一个从main()调用的独立函数 以下是相关代码:如何使用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
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
}
}
Ajson.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响应。只希望将解析后的数据显示给用户。