【问题标题】:How to convert socket message to json format in Python?如何在 Python 中将套接字消息转换为 json 格式?
【发布时间】:2022-10-15 19:19:25
【问题描述】:

我有以下行,它在传入的 Web 请求时接收一个字符串。

data_from_flask = c.recv(2048).decode('utf8')

消息是

'GET / HTTP/1.1\r\nHost: localhost:31477\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nsec-ch-ua: "Microsoft Edge";v="105", " Not;A Brand";v="99", "Chromium";v="105"\r\nsec-ch-ua-mobile: ?0\r\nsec-ch-ua-platform: "Windows"\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nSec-Fetch-Site: cross-site\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-User: ?1\r\nSec-Fetch-Dest: document\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: en-US,en;q=0.9\r\n\r\n'

我想将其加载到 JSON 格式使用

job_json = json.loads(data_from_flask)

如果我直接运行它,我会收到以下错误

发生异常:JSONDecodeError
期望值:第 1 行第 1 列(字符 0)

因为传入的字符串并不完全是 JSON 格式。

我能做到这一点的最简单方法是什么?有没有我可以使用的特殊编码?

【问题讨论】:

  • 如果传递的值不是 JSON 格式,则 json.loads() 可能无法工作。您拥有的是 HTTP 标头。需要决定你的 Python 字典需要是什么样子,然后你可以在需要时转换为 JSON

标签: python json sockets


【解决方案1】:

您所拥有的是一个代表 HTTP 标头的字符串。您可以对其进行解析以制作 Python 字典,该字典随后可以转换为 JSON。

例如:

import json

headers = """GET / HTTP/1.1
Host: localhost:31477
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="105", " Not;A Brand";v="99", "Chromium";v="105"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

"""

tokens = headers.split('
')
pd = {}

for t in tokens[1:]: # skip the protocol
    k, *v = t.split(':')
    if k:
        pd[k] = ':'.join(v).strip()

print(json.dumps(pd, indent=4))

输出:

{
    "Host": "localhost:31477",
    "Connection": "keep-alive",
    "Cache-Control": "max-age=0",
    "sec-ch-ua": ""Microsoft Edge";v="105", " Not;A Brand";v="99", "Chromium";v="105"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": ""Windows"",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Sec-Fetch-Site": "cross-site",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-User": "?1",
    "Sec-Fetch-Dest": "document",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "en-US,en;q=0.9"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2013-02-04
    • 2013-01-28
    相关资源
    最近更新 更多