5

我正在向 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 contentplay.golang.org/p/oJ5mqERAmj

4

1 回答 1

10

从您的十六进制转储来看,您正在接收 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)
}

以前的

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

游乐场链接

于 2013-10-07T15:49:21.117 回答