当前位置: 首页 > 面试题库 >

从精读的HTTP中解组JSON:无效字符寻找值的开头

章昱
2023-03-14
问题内容

我刚刚编写了第一个Go应用程序,该应用程序通过http下载并解组了简单的JSON对象。Http内容被压缩: 'content-encoding': 'deflate'

我用几个众所周知的例子(如此)。不幸的是,应用程序无法解析所需的JSON,并且出现了非常罕见的奇怪错误。我无法找出问题所在。任何帮助将不胜感激。

JSON输入 (使用Python进行调试)

In [8]: r = requests.get("http://172.17.0.31:20000/top")

In [9]: r.text
Out[9]: u'{"timestamp":{"tv_sec":1428447555,"tv_usec":600186},"string_timestamp":"2015-04-07 22:59:15.600186","monitor_status":"enabled"}'
In [18]: r.headers
Out[18]: {'content-length': '111', 'content-type': 'application/json', 'connection': 'close', 'content-encoding': 'deflate'}

源代码 (根据答案 更新

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

type Top struct {
    Timestamp        Timestamp `json:"timestamp"`
    String_timestamp string    `json:"string_timestamp"`
    Monitor_status   string    `json:"monitor_status"`
}

type Timestamp struct {
    Tv_sec  int `json:"tv_sec"`
    Tv_usec int `json:"tv_usec"`
}

func get_content() {

    url := "http://172.17.0.31:20000/top"

    res, err := http.Get(url)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(res)

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(body)

    var jsondata Top
    err = json.Unmarshal(body, &jsondata)
    if err != nil {
        panic(err.Error())
    }

    fmt.Println(jsondata)
}

func main() {
    get_content()
}

错误

[vitaly@thermaltake elliptics-manager]$ go run main.go 
&{200 OK 200 HTTP/1.1 1 1 map[Content-Type:[application/json] Content-Length:[111] Content-Encoding:[deflate]] 0xc20803e340 111 [] true map[] 0xc208028820 <nil>}
[120 156 77 203 65 14 130 48 16 70 225 171 152 127 93 76 59 51 162 244 50 13 96 99 154 216 98 232 192 134 112 119 81 55 110 95 190 183 65 83 142 85 251 252 130 223 160 107 168 113 132 119 66 55 145 182 117 108 62 109 249 70 98 234 108 183 27 84 157 83 121 132 191 19 100 221 165 177 210 216 235 137 200 11 123 230 243 207 195 32 79 37 233 52 135 3 235 82 15 29 75 63 60 227 29 251 27 195 90 38 189]
panic: invalid character 'x' looking for beginning of value

UPD:
谢谢大家。现在很明显,此问题的原因是deflateHTTP响应的压缩。但是,仍不清楚如何在Golang中执行减压。


问题答案:

Go JSON封送处理程序只能封送unicode字符串。看来您的JSON不是用Unicode编码的,而是使用其他一些编码(放气?)的。

如果采用字节流:

[120 156 77 203 65 14 130 48 16 70 225 171 152 127 93 76 59 51 162 244 50 13 96 99 154 216 98 232 192 134 112 119 81 55 110 95 190 183 65 83 142 85 251 252 130 223 160 107 168 113 132 119 66 55 145 182 117 108 62 109 249 70 98 234 108 183 27 84 157 83 121 132 191 19 100 221 165 177 210 216 235 137 200 11 123 230 243 207 195 32 79 37 233 52 135 3 235 82 15 29 75 63 60 227 29 251 27 195 90 38 189]

并尝试从中获取unicode字符串:

body := []byte{120, 156, 77, 203, 65, 14, 130, 48, 16, 70, 225, 171, 152, 127, 93, 76, 59, 51, 162, 244, 50, 13, 96, 99, 154, 216, 98, 232, 192, 134, 112, 119, 81, 55, 110, 95, 190, 183, 65, 83, 142, 85, 251, 252, 130, 223, 160, 107, 168, 113, 132, 119, 66, 55, 145, 182, 117, 108, 62, 109, 249, 70, 98, 234, 108, 183, 27, 84, 157, 83, 121, 132, 191, 19, 100, 221, 165, 177, 210, 216, 235, 137, 200, 11, 123, 230, 243, 207, 195, 32, 79, 37, 233, 52, 135, 3, 235, 82, 15, 29, 75, 63, 60, 227, 29, 251, 27, 195, 90, 38, 189}
fmt.Println(string(body))

您会在控制台中看到一个奇怪的(压缩的?)字符串,而不是JSON。

我猜想python http客户端会自动解压缩已压缩的字节,而Gohttp客户端不会(我知道gzip会这样做,但不确定是否要压缩)。在使用JSON编组器解析它们之前,您必须读出缩小的字节并将其转换为unicode字符串。



 类似资料:
  • 问题内容: 我正在尝试在其中发布带有xml消息的json。但是它返回 无效的字符“ b”正在寻找价值的起点 我认为可能的原因是我试图封送非json格式的return正文。 错误发生在这一行 问题答案: 该错误表明服务器未返回有效的JSON响应。我建议添加以下代码来调试问题:

  • 问题内容: 我使用Golang HTTP请求获取json输出,如下所示。我尝试访问的Web服务是Micrsoft Translator https://msdn.microsoft.com/en- us/library/dn876735.aspx 我收到一个错误 因此,我尝试打印as字符串,它显示: 看来数据没有任何问题,所以我尝试通过创建相同的值 我发现原始数据可能有问题,因此我尝试比较两种格式

  • 问题内容: 当我走时,我收到以下错误消息: 安装的Docker版本: 使用以下方式安装: 我已确保网络存在并且可以访问其他站点。请帮忙 更新1:问题不能是设置MTU,因为几天后我可以从Docker集线器中将映像拉回到同一台机器上。 由于我在家庭网络中,因此该问题也可能不是HTTP_PROXY 问题答案: 该错误消息几乎没有误导性。问题不在于字符无效,而是网络配置错误。我有一个LAN接口和一个WLA

  • 我有一个字符串,可以是两种形式之一: 或 其中<代码> {...}和< code>[...]是任何有效的JSON。我只对解析出字符串的JSON部分感兴趣,但是我不确定最好的方法是什么(特别是因为我不知道字符串将是两种形式中的哪一种)。这是我目前的方法: 这是有效的,但我忍不住觉得可以做得更好。我想可能是regex,但我在匹配子对象和数组时遇到了问题,而不是最外部的json对象或数组。有什么建议吗?

  • 在Jenkins中解析json文件时面临以下错误 Json文件 错误 hudson.remoting.代理异常:net.sf.json.JSONExcture:无效的JSON字符串在net.sf.json.JSONSerializer.toJSON(JSONSerializer.java:143)在net.sf.json.JSONSerializer.toJSON(JSONSerializer.j

  • 问题内容: 我想知道是否有一种方法可以解码类似JSON的字符串。 我得到了字符串: 这不是有效的JSON字符串,因此我无法直接使用python API对其进行解码。Python将仅接受字符串化的JSON字符串,例如: 其中属性被引用为字符串。 问题答案: 使用demjson模块,该模块具有在非严格模式下解码的能力。