2014-10-01 2 views
2

Я пытаюсь создать простой API, используя Flask. Теперь я хочу, чтобы вернуть список dicts следующим образом:Flask jsonify возвращает странный массив?

print results # prints out [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}] 
response = make_response(jsonify(results)) 
response.headers['Content-Type'] = 'application/json' 
return response 

Но когда я иду на URL в браузере, я получаю следующее:

{ 
    "date": "title" 
} 

Кто-нибудь знает, что я делаю Неправильно здесь? Все советы приветствуются!

ответ

7

jsonify() принимает только словари. Если вы дадите ему список, он превратит объект в словарь, с dict(argument). Смотрите Flask.jsonify() documentation:

Создает Response с представлением JSON из приведенных аргументов с application/json MimeType. Аргументы этой функции такие же, как и для конструктора dict.

(выделено мной)

В вашем случае у вас есть список с одним элементом, и этот элемент, когда итерации, имеет 2 значения. Эти два значения становятся ключом и значения выходного словаря:

>>> results = [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}] 
>>> dict(results) 
{'date': 'title'} 

Это потому, что dict() конструктор либо принимает другой словарь, ключевые аргументы или итератора из (key, value) пар.

Решение не миновать в списке, но дать его, по крайней мере, ключ:

response = jsonify(results=results) 

jsonify() уже возвращает объект ответа, нет необходимости вызывать make_response() на него. Вышеописанное создает объект JSON с ключом 'results' и ваш список как значение.

jsonify() принимает только словарь по соображениям безопасности. Повторное цитирование документации:

По соображениям безопасности поддерживаются только объекты. Для получения дополнительной информации об этом см. JSON Security.

Если вы действительно хотите, чтобы обойти это, вы должны создать свой собственный ответ:

from Flask import json 

response = make_response(json.dumps(results), mimetype='application/json') 
+0

Ач , в этом есть смысл. Но что, если я действительно хочу предоставить список, а не словарь? Разве не просто API-интерфейсы просто возвращать список объектов? – kramer65

+0

@ kramer65: API обычно обертывают списки объектов в объекте по соображениям безопасности. Я обновил ответ со ссылками и как обойти это, если вы хотите игнорировать совет. –

+0

@ kramer65 'import json; json.dumps (results) ', затем make_response на этом – metaperture

0

Это больше не должно быть проблемой в настоящее время этот метод КОЛБУ в jsonify() сериализует массивы верхнего уровня (как от this commit).

Вам нужно будет использовать основную ветку от GitHub до тех пор, пока новая версия не будет нажата на Pypi, которая включает это исправление.

Для удобства, вы можете передать список Python: jsonify([1,2,3]) Или пройти в серии args: jsonify(1,2,3)

Оба будут преобразованы в: [1,2,3]

Подробности здесь: http://flask.pocoo.org/docs/dev/api/#flask.json.jsonify

Смежные вопросы