Python 尝试将字符串转换为字典时,json.loads(string)抛出json.decoder.jsondeCoderror

Python 尝试将字符串转换为字典时,json.loads(string)抛出json.decoder.jsondeCoderror,python,json,Python,Json,我正在使用请求库进行api调用。json响应随后被格式化为字符串,并作为结果的一部分发送到我的服务器,如代码段所示: def get_and_send(url, method): resp = requests.request(url=url, method=method, **kwargs) result = f'{{ "status_code":{resp.status_code}, "content":{resp.json()} }}' send_to_ser


我正在使用
请求
库进行api调用。json响应随后被格式化为字符串,并作为结果的一部分发送到我的服务器,如代码段所示:

def get_and_send(url, method):
     resp = requests.request(url=url, method=method, **kwargs)
     result = f'{{ "status_code":{resp.status_code}, "content":{resp.json()} }}'
     send_to_server(result)
我打算将此结果从服务器上的字符串结果转换回dictionary对象。
我遇到的问题是,当我使用
json.loads(result)
将字符串转换为dictionary对象时,它会抛出以下错误

Exception in thread Thread-2: Traceback (most recent call last):
File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
File "/home/adipster/PycharmProjects/ScriptBackbone/ts_server/agent_thread.py", line 39, in run
    resp_data = self._task_formatter.format_response(response) # Formats the response
File "/home/adipster/PycharmProjects/ScriptBackbone/utils/task_formatter.py", line 26, in format_response
    response = self.get_dict_response(response.decode().strip())
File "/home/adipster/PycharmProjects/ScriptBackbone/utils/task_formatter.py", line 36, in get_dict_response
    raise exp
File "/home/adipster/PycharmProjects/ScriptBackbone/utils/task_formatter.py", line 34, in get_dict_response
    return json.loads(response)
File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.6/json/decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 32 (char 31)
我知道错误是因为我的所有键都必须在双引号中,而当
resp.json()
被格式化为字符串时,情况并非如此。 请有人帮助我如何确保dictionary对象的所有键都在双引号中?
或任何其他替代方案将受到欢迎。谢谢

正如您所指出的,问题是,如果您只进行字符串插值(例如,使用
f
-string),JSON对象中字符串的引号将是单引号,但JSON格式需要双引号

要解决这个问题,可以使用
json.dumps
,它接受一个json对象(在Python中)并将其转换为正确格式的json字符串。编辑感谢Charles Duffy:只需将整个
result\u data
对象创建为字典,然后使用
JSON.dumps将其一次性转换为JSON,就可以完全避免使用
f
-字符串

例如:

import json

def get_and_send(url, method):
    resp = requests.request(url=url, method=method, **kwargs)
    result_data = {
        "status_code": resp.status_code,
        "content": resp.json(),
    }
    result = json.dumps(result_data)
    send_to_server(result)

我们需要看到具体的响应来说明它为什么不是有效的JSON…或者您可以使用
JSON.dumps()
创建它,这样它就可以保证是有效的JSON。也就是说:
result=json.dumps({“status\u code”:resp.status\u code,“content”:resp.json()})
(如果
resp.json()
返回一个本地Python数据结构)。@CharlesDuffy,我想你在这一点上说得有道理。我会试试你的建议的。@charlesduff你应该把它作为一个答案贴出来。这就像亨利回答中的查米特一样,我对此投了赞成票如果我们希望
result
是JSON,为什么还要使用f字符串,而不是让
JSON.dumps()
也格式化顶层呢?@CharlesDuffy哦,这样更好