我正在访问以下列形式返回JSON的API:
[{"UniqueID":1234, "DocID":5678}, {"UniqueID":5678, "DocID":9101112}]
此API是用Go编写的,示例输出是返回在浏览器中的显示方式。 content-type标头是application / json
我有以下代码来检索和解组它:
type UniqueIDDocID struct{
UniqueID int64 `json: "UniqueID"`
DocID int64 `json: "DocID"`
}
type UniqueIDDocIDCollection struct{
FullList []UniqueIDDocID
}
func retrieveUniqueIDByPublication(nodeid int64, publication string){
// call the API
//hgr := new(retrieval.HttpGetRetrieval)
// endpoint is defined here - I have removed for privacy reasons
fmt.Println(endpoint) // the url which I know works
/*response, err := hgr.RequestResponse(endpoint)
if err != nil {
l4g.Warn("Could not retrieve the endpoint %s. Error: ", endpoint, err)
return
}
defer hgr.CloseResponse(response)
queryResult := hgr.ReadResponse(response)*/
client := new(http.Client)
request, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
l4g.Warn("Could not retrieve the endpoint %s. Error: %v", endpoint, err)
return
}
request.Header.Set("Content-Type", "applicaiton/json")
response, err := client.Do(request)
if err != nil {
l4g.Warn("Could not retrieve the endpoint %s. Error: %v", endpoint, err)
return
}
defer response.Body.Close()
var reader io.ReadCloser
reader = response.Body
defer reader.Close()
queryResult, readErr := ioutil.ReadAll(reader)
if err != nil {
l4g.Warn("Could not retrieve the endpoint %s. Error: %v", endpoint, readErr)
return
}
if queryResult == nil {
l4g.Warn("Nothing returned %s.", endpoint)
return
}
var details UniqueIDDocIDCollection
// process return
if err:=json.Unmarshal(queryResult, &details); err != nil{
l4g.Warn("Failed to unmarshall return %v from %s", queryResult, endpoint)
return
}
writeUniqueIDFile(details)
}
我得到了#34;未能解散"消息和日志中的详细信息显示如下内容:
[91 123 34 85 110 105 113 117 101 73 68 34 58 34 56 51 57 51 50 53 56 54 34 44 34 68 111 99 73 68 34 58 52 49 50 49 54 57 49 57 125 44 123 34 85 110 105 113 117 101]
作为代表性样本。
在这个unmarshall步骤中我做错了什么?
我想要的输出是UniqueIDDocIDCollection结构上有一个切片,其中包含UniqueIDDocID类型的项目,然后我可以从中获取UniqueID并将其写入行分隔文件。
我一直在谷歌上搜索过很多东西,但每次这都是我得到的。
如果您对源JSON有任何建议,请分享这些建议,因为我可以在API中进行更改。
提前感谢您的帮助 森
答案 0 :(得分:1)
错误数据是[]字节切片;如果你把它打印到%s(fmt.Printf("foo: %s\n", foo)
)或者现在把它包裹在string(foo)
中,你可能会得到更有用的东西。
我为你的Unmarshall做了一个更简单的例子,它似乎工作得很好。我怀疑问题出在输入数据上吗?
package main
import (
"encoding/json"
"log"
)
type UniqueIDDocID struct {
UniqueID int64 `json: "UniqueID"`
DocID int64 `json: "DocID"`
}
type UniqueIDDocIDCollection struct {
FullList []UniqueIDDocID
}
const INPUT = `[{"UniqueID":1234, "DocID":5678}, {"UniqueID":5678, "DocID":9101112}]`
func main() {
coll := new(UniqueIDDocIDCollection)
err := json.Unmarshal([]byte(INPUT), &coll.FullList)
if err != nil {
log.Printf("Could not unmarshall %s: %s", INPUT, err)
}
log.Printf("Now have data: %#v\n", coll)
}
Now have data: &main.UniqueIDDocIDCollection{FullList:[]main.UniqueIDDocID{main.UniqueIDDocID{UniqueID:1234, DocID:5678}, main.UniqueIDDocID{UniqueID:5678, DocID:9101112}}}
首先将“失败的unmarshall”错误消息中的%v
更改为%s
;也许你没有你期望的数据。你还应该包括从json.Unmarshall返回的错误,它可能会告诉你出了什么问题。 : - )