json.dumps vs flask.jsonify


276

나는 그 목적을 이해하지 못한다 flask.jsonify 방법 . 이로부터 JSON 문자열을 만들려고합니다.

data = {"id": str(album.id), "title": album.title}

하지만 내가 얻는 json.dumps것과는 내가 가진 것과 다릅니다 flask.jsonify.

json.dumps(data): [{"id": "4ea856fd6506ae0db42702dd", "title": "Business"}]
flask.jsonify(data): {"id":…, "title":…}

분명히 나는 json.dumps반환 하는 것과 더 비슷한 결과를 얻어야 합니다. 내가 뭘 잘못하고 있죠?

답변:


369

jsonify()플라스크 의 함수는 flask.Response()json 응답과 함께 사용하기에 적절한 컨텐츠 유형 헤더 'application / json'이 이미 있는 객체를 반환합니다 . 반면,이 json.dumps()메소드는 인코딩 된 문자열을 반환하므로 MIME 유형 헤더를 수동으로 추가해야합니다.

[정보 더보기 jsonify()기능 여기에 전체 참조하십시오.

편집 : 또한 jsonify()kwarg 또는 사전 을 처리하는 동시에 json.dumps()목록 및 기타를 지원 한다는 것을 알았 습니다.


31
jsonify()지금 목록을 처리합니다. 이 커밋을 참조하십시오 .
Jeff Widman

3
그러나 여전히 SQLAlchemy 객체와 목록을 JSON으로 바꾸지 않습니다.
ajbraus

91

넌 할 수있어:

flask.jsonify(**data)

또는

flask.jsonify(id=str(album.id), title=album.title)

82

이것은 flask.jsonify()

def jsonify(*args, **kwargs):
    if __debug__:
        _assert_have_json()
    return current_app.response_class(json.dumps(dict(*args, **kwargs),
        indent=None if request.is_xhr else 2), mimetype='application/json')

사용 된 json모듈은 순서대로 simplejson또는 json순서대로 있습니다. 객체 즉 응용 프로그램에 current_app대한 참조 Flask()입니다. 클래스에 response_class()대한 참조 Response()입니다.


42

하나 또는 다른 것을 선택하는 것은 당신이하려는 일에 달려 있습니다. 내가 이해하는 것에서 :

  • jsonify 는 누군가가 json을 쿼리하고 반환 할 API를 빌드 할 때 유용합니다. 예 : REST github API는이 메소드를 사용하여 요청에 응답 할 수 있습니다.

  • dumps 는 data / python 객체를 json으로 포맷하고 응용 프로그램 내에서 작업하는 것에 관한 것입니다. 예를 들어, 일부 자바 스크립트가 그래프를 표시하는 표현 레이어에 객체를 전달해야합니다. 덤프로 생성 된 Json으로 자바 스크립트를 제공합니다.


4
나는 그 차이를 전혀 이해하지 못한다.
vidstige

11
@vidstige : jsonify 는 헤더를 "content-type : application / json"으로 설정하고 페이로드를 JSON으로 변환 된 문자열 dict로 설정하여 flask.Response () 객체를 만듭니다. 덤프는 단순히 JSON 문자열로 변환됩니다. 올바른 형식의 플라스크가 아닙니다 .Response () 객체입니다. 따라서 뷰에 "return json.dumps (dict)"가 표시되면 수신자는 json.dumps 출력을 페이로드로 사용하여 일반 "content-type : text / html"응답을 받게됩니다.
SamEsla

3
@ SamEsla 예, 알고 있지만 해당 정보에는 아무것도 없습니다.
vidstige

0

치다

data={'fld':'hello'}

지금

jsonify(data)

{ 'fld': 'hello'}를 생성하고

json.dumps(data)

준다

"<html><body><p>{'fld':'hello'}</p></body></html>"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.