为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕妹3146593 2021-06-30 13:39:36
我正在向一个 API 发出请求,我得到了一个[]byte响应 ( ioutil.ReadAll(resp.Body))。我正在尝试解组此内容,但似乎未以 utf-8 格式编码,因为解组返回错误。我正在尝试这样做:package mainimport (    "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
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

根据您的十六进制转储判断您正在接收 gzip 编码的数据,因此您需要先使用compress/gzip 对其进行解码。


尝试这样的事情


package main


import (

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


查看完整回答
反对 回复 2021-07-05
  • 1 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信