1

我正在访问一个以以下形式返回 JSON 的 API:

[{"UniqueID":1234, "DocID":5678}, {"UniqueID":5678, "DocID":9101112}]

这个 API 是用 Go 编写的,示例输出是返回在浏览器中的显示方式。内容类型标头是 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)
    }

我收到“无法解组”消息,日志中的详细信息显示如下:

[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]

作为代表样本。

在这个解组步骤中我做错了什么?

我想要的输出是 UniqueIDDocIDCollection 结构上有一个切片,其中包含 UniqueIDDocID 类型的项目,然后我可以从中获取 UniqueID 并将其写入行分隔的文件。

我一直在谷歌搜索并尝试了很多东西,但每次都是我得到的。

如果您也对源 JSON 有任何建议,请分享这些建议,因为我可以在 API 中进行更改。

感谢您提前内森的帮助

4

1 回答 1

1

错误数据是 []byte 切片;fmt.Printf("foo: %s\n", foo)如果您将它打印到 %s ( ) 或您现在拥有的任何地方,您可能会得到更有用的东西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)

}

输出(在 play.golang 上试试

Now have data: &main.UniqueIDDocIDCollection{FullList:[]main.UniqueIDDocID{main.UniqueIDDocID{UniqueID:1234, DocID:5678}, main.UniqueIDDocID{UniqueID:5678, DocID:9101112}}}

首先在“无法解组”错误消息中更改%v为;%s也许您没有您期望的数据。您还应该包括从 json.Unmarshall 返回的错误,它可能会告诉您出了什么问题。:-)

于 2013-07-23T17:02:00.587 回答