如何解压缩 gzip 格式的 []byte 内容,在解组时出现错误

我正在向一个 API 发出请求,我得到了一个[]byte响应 ( ioutil.ReadAll(resp.Body))。我正在尝试解组此内容,但似乎未以 utf-8 格式编码,因为解组返回错误。我正在尝试这样做:


package main


import (

    "encoding/json"

    "fmt"


    "some/api"

)


func main() {

    content := api.SomeAPI.SomeRequest() // []byte variable

    var data interface{}

    err := json.Unmarshal(content, &data)

    if err != nil {

        panic(err.Error())

    }

    fmt.Println("Data from response", data)

}

我得到的错误是invalid character '\x1f' looking for beginning of value. 作为记录,响应在标头中包含Content-Type:[application/json; charset=utf-8].


解组时如何解码content以避免这些无效字符?


编辑


这是 hexdump 的content:play.golang.org/p/oJ5mqERAmj


慕妹3146593
浏览 262回答 1
1回答

拉风的咖菲猫

根据您的十六进制转储判断您正在接收 gzip 编码的数据,因此您需要先使用compress/gzip 对其进行解码。尝试这样的事情package mainimport (    "bytes"    "compress/gzip"    "encoding/json"    "fmt"    "io"    "some/api")func main() {    content := api.SomeAPI.SomeRequest() // []byte variable    // decompress the content into an io.Reader    buf := bytes.NewBuffer(content)    reader, err := gzip.NewReader(buf)    if err != nil {        panic(err)    }    // Use the stream interface to decode json from the io.Reader    var data interface{}    dec := json.NewDecoder(reader)    err = dec.Decode(&data)    if err != nil && err != io.EOF {        panic(err)    }    fmt.Println("Data from response", data)}以前的字符\x1f是 ASCII 和 UTF-8 中的单位分隔符。它永远不是 UTF-8 编码的一部分,但可用于标记文本的不同位。\x1f据我所知,一个字符串可以是有效的 UTF-8,但不是有效的 json。我认为您需要仔细阅读 API 规范以了解他们使用\x1f标记的目的,但同时您可以尝试删除它们并查看会发生什么,例如import (    "bytes"    "fmt")func main() {    b := []byte("hello\x1fGoodbye")    fmt.Printf("b was %q\n", b)    b = bytes.Replace(b, []byte{0x1f}, []byte{' '}, -1)    fmt.Printf("b is now %q\n", b)}印刷b was "hello\x1fGoodbye"b is now "hello Goodbye"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go