【问题标题】:Parsing HTTP array response with python用python解析HTTP数组响应
【发布时间】:2018-02-09 17:11:41
【问题描述】:

我正在尝试通过 json 解析 HTTP 响应,但它给了我字符错误,但是当我尝试通过 for 循环遍历此响应时,它会将所有内容拆分为单个字符。有没有更好的方法来解析这个响应?

代码:

    _url = self.MAIN_URL
    try:
        _request = self.__webSession.get(_url, cookies=self.__cookies)
        if _request.status_code != 200:
            self.log("Request failed with code: {}. URL: {}".format(_request.status_code, _url))
            return
    except Exception as err:
        self.log("[e4] Web-request error: {}. URL: {}".format(err, _url))
        return

    _text = _request.json()

json.loads() 返回以下

 Expecting value: line 1 column 110 (char 109)

需要解析HTTP响应:

[
  [
    9266939,
    'Value1',
    'Value2',
    'Value3',
            ,
    'Value4',
        [
            [
                'number',
                'number2',
                    [
                        'value',
                               ,
                        'value2'
                    ]
            ]
        ]
  ],
  [
    5987798,
    'Value1',
    'Value2',
            ,
    'Value3',
    'Value4',
        [
            [
                'number',
                'number2',
                    [
                        'value',
                        'value2'
                    ]
            ]
        ]
  ]
]

【问题讨论】:

  • 您可以使用 json.loads 函数从您的 json 文本字符串中获取类似 python 的对象。 docs.python.org/3/library/json.html
  • 不能,它返回 - 期望值:第 1 行第 110 列(字符 109)
  • 在这个 url 中检查你的 http 响应:json check;

标签: python json python-3.x http parsing


【解决方案1】:

虽然错误消息由于行号和列号而令人困惑,但JSON format 在任何情况下都不接受字符串的单引号,因此给定的 HTTP 响应不是 JSON 格式。您必须对字符串使用双引号。

所以你必须改为这样输入(如果你可以控制它):

[
  [
    9266939,
    "Value1",
    "Value2",
    "Value3",
    "Value4",
    [
        [
        "number",
        "number2",
            [
            "value",
            "value2"
            ]
        ]
...

如果您无法控制正在解析的 HTTP 响应,则可以在解析之前将所有单引号替换为双引号:

http_response_string = (get the HTTP response)
adjusted_http_response_string = http_response_string.replace("'", '"')
data = json.loads(adjusted_http_response_string)

但这当然会带来替换不应作为字符串分隔符的单引号(或撇号)的潜在风险。不过,它可能会充分解决问题,而且大部分时间都能正常工作。

编辑:

根据 cmets 的要求进一步清理:

http_response_string = (get the HTTP response)

# More advanced replacement of ' with ", expecting
# strings to always come after at least four spaces,
# and always end in either comma, colon, or newline.
adjusted_http_response_string = \
    re.sub("(    )'", r'\1"',
    re.sub("'([,:\n])", r'"\1',
    http_response_string))

# Replacing faulty ",  ," with ",".
adjusted_http_response_string = \
    re.sub(",(\s*,)*", ",", 
    adjusted_http_response_string)

data = json.loads(adjusted_http_response_string)

【讨论】:

  • 是否有机会替换 http_response 中的空值?
  • @ReyCreed 不客气。 :-) 空值?就像你没有得到一些 JSON 而不是什么?你能举个例子吗?你想用什么来替换这些空值?
  • 我用给出的空值编辑了我的主题的 http 响应。一切都很好地解析,但是当有一些空值时,当有单引号时它会抛出同样的错误 - 期望值:第 1 行第 20 列(字符 19)
  • 啊,“,”,逗号之间没有任何内容。好吧,这是另一个 JSON 语法错误。我猜您希望它解析为好像只有一个逗号?在这种情况下使用 adjusted_http_response_string = re.sub(",(\s*,)*", ",", adjusted_http_response_string)import re 更早。但是在评论中回答有点长。你能控制 HTTP 输出吗?它不是真正的 JSON,应该在它生成的地方进行更正。
  • 很好,修复了我的下一个语法错误,但现在我有了下一个,当有多个空值彼此相邻时,空逗号分隔值和更多空逗号分隔值。我没有控制 HTTP 输出,这就是为什么这很讨厌。
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 2014-09-03
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2011-08-09
相关资源
最近更新 更多