如何在JSON字典值中替换引号?



我正在使用Open Trivia DB的API来生成琐事问题。

import requests, json, urllib.parse
import 
url = "https://opentdb.com/api.php"
querystring = {"amount":"5","type":"multiple","encode":"url3986"}
response = requests.request("GET", url, params=querystring)
response_decoded = urllib.parse.unquote(response.text)
print(response_decoded)
response_dict = json.loads(response_decoded)
print(response_dict["results"][0])

然而,我总是遇到一个错误,错误是:

Exception has occurred: JSONDecodeError
Expecting ',' delimiter: line 1 column 347 (char 346)

我发现这个错误是因为在一些类似Who is the main character in "gamename"的问题中,gamename周围有引号。在返回的JSON上下文中,它看起来像这样:

"question":"Who is the main character in "gamename"?",
"correct_answer":"maincharacter",
"incorrect_answers":["wrongname1","wrongname2","wrongname3"]

和游戏名周围的引号混淆了字典。

是否有一种方法可以让我只将内部引号(围绕游戏名)替换为单数引号,',这样就不会弄乱字典结构?

不要自己解析响应。使用requests,它将处理引号:

import requests
resp = requests.get(
"https://opentdb.com/api.php",
params={"amount": "5", "type": "multiple", "encode": "url3986"},
)
resp.raise_for_status()  # raise an Exception if the HTTP response failed
data = resp.json()  # Parse JSON from the response
print(data["results"][0])  # print it

查看数据,一些内部字段显示为url编码。使用urllib.parse.unquote:

import urllib.parse
print(urllib.parse.unquote("Entertainment%3A%20Music"))  # Entertainment: Music

通过解码原始字符串,您将导致JSON格式错误。相反,您可以先json.loads它。当您需要输出其中的任何部分时,您可以使用urllib解码每个单独的字符串。

另一种更脆弱的方法是像

这样做
response_decoded = urllib.parse.unquote(response.text.replace('"', '~')).replace('"', r'"').replace('~', '"').

如果遇到任何问题,您可以使用不同于~的字符;我只是选择了一些不寻常的东西。

相关内容

  • 没有找到相关文章

最新更新