#python #json #python-3.x
#python #json #python-3.x
Вопрос:
Приведенный ниже код возвращает данные в формате, отличном от json. Я попытался преобразовать вывод в формате json, но безуспешно. Чего мне здесь не хватает?
import requests
import json
from flask import Flask, jsonify, request, render_template
import os
app = Flask(__name__)
headers = {
"Content-type": "application/json",
}
def map_status(data):
if(data['install_status']=='1'):
data['install_status']='Installed'
elif(data['install_status']=='3'):
data['install_status']='Maintenance'
return data
@app.route('/outages')
def Outages():
url = "https://my-api.local.com/data"
response = requests.get(url)
result_data = json.loads(response.text)
result_data['result'] = map(map_status, result_data['result'])
return str(list(result_data['result']))
Вот текущий вывод, который, по-видимому, имеет формат HTML или text (я хочу получить формат json)
[{'install_status': 'Installed', 'name': 'server1'}, {'install_status': 'Installed', 'name': 'server2'}]
Формат, который я ищу, выглядит следующим образом:
{"result":[{'install_status': 'Installed', 'name': 'server1'}, {'install_status': 'Installed', 'name': 'server2'}]}
Комментарии:
1. Вы пробовали опускать
['result']
при возврате значения ?!2. Да, это вывод: [‘result’]
3.Нет, не возврат
['result']
, а возвратresult_data
вместоresult_data['result']
.4. да, тогда я получаю ту же ошибку, о которой я упоминал в Tenacious
Object of type map is not JSON serializable
Ответ №1:
Ваш текущий ответ по-прежнему json, только без первого "result"
объекта. Вы должны быть в состоянии получить ожидаемый ответ с помощью этого (см. Последнюю строку), но вам действительно нужно иметь его в этом формате?:
@app.route('/outages')
def Outages():
url = "https://my-api.local.com/data"
response = requests.get(url)
result_data = json.loads(response.text)
result_data['result'] = dict(map(map_status, result_data['result']))
return result_data # just result
Комментарии:
1. Я попробовал ваше предложение, но, используя только return result_data, я получаю следующую ошибку:
2021-01-07T14:30:31.226-03:00 [APP/PROC/WEB/0] [ERR] raise TypeError(f'Object of type {o.__class__.__name__} ' 2021-01-07T14:30:31.226-03:00 [APP/PROC/WEB/0] [ERR] TypeError: Object of type map is not JSON serializable
2. ах, я пропустил карту, обновленную для преобразования ее в словарь
3. Я понял идею, но использование dict нарушает код..
dict(result_data['result']) = map(map_status, result_data['result']) ^ SyntaxError: cannot assign to function call
4. Почти готово! Код работает сейчас, но вывод не возвращает никаких данных. Вывод на экран
{"result":{"install_status":"name"}}
5. Хорошие новости, я смог заставить его работать. Я только что изменил dict по списку. Я не уверен, почему так получилось, но это работает. Я всегда путаюсь в dict, tuple, list на python. Если кто-то знает, почему он работал со списком вместо dict, пожалуйста, дайте мне знать
Ответ №2:
Приведенный ниже код работает. Спасибо, ребята, что указали мне правильное направление!
import requests
import json
from flask import Flask, jsonify, request, render_template
import os
app = Flask(__name__)
headers = {
"Content-type": "application/json",
}
def map_status(data):
if(data['install_status']=='1'):
data['install_status']='Installed'
elif(data['install_status']=='3'):
data['install_status']='Maintenance'
return data
@app.route('/outages')
def Outages():
url = "https://my-api.local.com/data"
response = requests.get(url)
result_data = json.loads(response.text)
result_data['result'] = list(map(map_status, result_data['result']))
return result_data # just result