Преобразование выходных данных в формате json

#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