#python #python-3.x
#python #python-3.x
Вопрос:
Я работаю над скриптом python, который будет считывать json и искать определенный ключ. Пока что я могу заставить ее работать, если я включу свои значения json в качестве переменной. Однако моя конечная цель — прочитать значения json из файла. Вот код, над которым я работал:
import jwt
import os
jwks = {
"keys": [
{
"kty": "RSA",
"use": "sig",
"kid": "123456ABCDEF",
"x5t": "123456ABCDEF",
"n": "qa9f6h6h52XbX0iAgxKgEDlRpbJw",
"e": "AQAB",
"x5c": [
"43aw7PQjxt4/MpfNMS2BfZ5F8GVSVG7qNb352cLLeJg5rc398Z"
]
},
{
"kty": "RSA",
"use": "sig",
"kid": "987654ghijklmnoP",
"x5t": "987654ghijklmnoP",
"n": "qa9f6h6h52XbX0iAgxKgEDlRpbJw",
"e": "AQAB",
"x5c": [
"1234R46Qjxt4/MpfNMS2BfZ5F8GVSVG7qNb352cLLeJg5rc398Z"
]
}
]
}
class InvalidAuthorizationToken(Exception):
def __init__(self, details):
super().__init__('Invalid authorization token: ' details)
def get_jwk(kid):
for jwk in jwks.get('keys'):
if jwk.get('kid') == kid:
print ('This is jwk:', jwk)
return jwk
raise InvalidAuthorizationToken('kid not recognized')
#Execute
get_jwk('123456ABCDEF')
get_jwk('987654ghijklmnoP')
Здесь я пытаюсь заменить те же значения и сохранить их в отдельном файле (jwks-keys) и прочитать его как переменную. Однако я получаю следующую ошибку и не понимаю, что я сделал. Как мне правильно сконструировать эту функцию?
Вот трассировка:
Traceback (most recent call last):
File "printjwks2.py", line 59, in <module>
get_jwk('123456ABCDEF')
File "printjwks2.py", line 51, in get_jwk
for jwk in jwks.get('keys'):
AttributeError: 'str' object has no attribute 'get'
Вот функция:
def get_jwk(kid):
with open('testkeys/jwks-keys', 'r') as az:
jwks = az.read()
for jwk in jwks.get('keys'):
if jwk.get('kid') == kid:
print (jwk)
return jwk
raise InvalidAuthorizationToken('kid not recognized')
Комментарии:
1. Ваш первый
jwks
— это dict. Когда вы читаете что-то из файла, это просто строка. Возможно, вы хотите ее декодировать в формате JSON?
Ответ №1:
with open('testkeys/jwks-keys', 'r') as az:
jwks = az.read()
Здесь jwks
просто объект string, потому что az.read()
возвращает его в виде строки . Таким образом, вы должны десериализовать данные JSON в объекты Python перед применением jwks.get('keys')
.
>>> sample_json = '{"json_key": "json_value"}'
>>> sample_json.get("json_key")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'get'
>>> import json
>>> json.loads(sample_json).get("json_key")
'json_value'
Поскольку вы читаете JSON из файла, вы можете использовать json.load
для десериализации fp
(текстовый файл с поддержкой .read() или двоичный файл, содержащий документ JSON) в объект Python
>>> import json
>>> with open('testkeys/jwks-keys', 'r') as az:
... jwks = json.load(az)