json 및 Json Response

4215 단어
json은 데이터 형식의 변환을 지원하지 않습니다.
우리가 json 모듈의dumps로 json 모듈이 지원하지 않는 데이터 형식을 json 문자열로 변환할 때 오류가 발생합니다
TypeError: Object of type'datetime'is not JSON serializable "datetime 유형의 객체는 json에서 해석할 수 없습니다."
그러나 현재의 업무 논리는 우리가 굳이 그가 해석할 수 있도록 해야 할 때 그의 원본을 보는 것이다.
dumps의 원본 코드로 들어가기
ff dumps(obj,*,skipkeys=False,ensure ascii=True,check circular=True,allow nan=True,cls=None,indent=None,separators=None,default=None,sort keys=False,*kw): 안에 cls=None가 있는 것을 보았을 때 cls가 무엇인지 보지 말고 아래를 내려다보세요.
if cls is None: cls = JSONEncoder에서 JSONEncoder를 눌러 그의 원본 코드를 보고,
def default(self, o):
    """Implement this method in a subclass such that it returns
    a serializable object for ``o``, or calls the base implementation
    (to raise a ``TypeError``).

    For example, to support arbitrary iterators, you could
    implement default like this::

        def default(self, o):
            try:
                iterable = iter(o)
            except TypeError:
                pass
            else:
                return list(iterable)
            # Let the base class default method raise the TypeError
            return JSONEncoder.default(self, o)

    """
    raise TypeError("Object of type '%s' is not JSON serializable" %
                    o.__class__.__name__)

이 버퍼링 이상을 보았습니다. 우리의 오퍼링과 같기 때문에, 우리는 이 JSONEncoder 종류의default를 다시 쓰는 방법을 통해 우리가 원하는 업무 논리를 실현할 수 있습니다.
class MyJsonClass(json.JSONEncoder): def default(self, o):if isinstance(o,datetime): # o가 json이 기본적으로 서열화되지 않으면 이 방법에서 json이 돌릴 수 있는 형식인return o.strftime('%Y-%m-%d')else: super()로 처리합니다.default(self, o) 예를 들어 우리dumps의 대상은datetime 형식의 데이터이다. 그러면 이곳의 isinstance 두 번째 매개 변수는 이것을 써서 대상이 그의 하위 클래스인지 아닌지를 판단한다. 그러면 수동으로 그에게 바꾸어 주고 다시 되돌려준다. 물론 이런 종류가 아닐 때 이전의 기능을 계속 사용해야 하기 때문에 부류의default 방법을 호출한다.
d={'ctime':datetime.today()}print(json.dumps(d,cls=MyJsonClass)) 이때 이 안에cls=MyJsonClass를 쓰면 됩니다. 다시 보면 원본 코드는 json이 어떻게 서열화되었는지 설명합니다.
JsonResponse
Django는 우리가 json 모듈을 가져와서 서열화할 필요가 없는 간단한 방법이 있습니다.
다음 모듈 가져오기
from django.http import Json Response를 다시 호출하시면 됩니다.
l = [1,2,3,4,5,5,6] return JsonResponse(user,json_dumps_params={'ensure_ascii':False})
json_dumps_파람스가 뭐예요?Json Response의 원본 코드를 들어가 보세요.
class JsonResponse(HttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
             json_dumps_params=None, **kwargs):
    if safe and not isinstance(data, dict):
        raise TypeError(
            'In order to allow non-dict objects to be serialized set the '
            'safe parameter to False.'
        )
    if json_dumps_params is None:
        json_dumps_params = {}
    kwargs.setdefault('content_type', 'application/json')
    data = json.dumps(data, cls=encoder, **json_dumps_params)
    super(JsonResponse, self).__init__(content=data, **kwargs)

Django는 우리에게 json 모듈을 가져오지 말라고 했다. 그의 Json Response를 사용하고 그 자신은
Json Response가 실현하는 방법은 여전히 json 모듈을 바탕으로 하는 것이다.*jsondumps_params는 매개 변수입니다. 그래서 우리는 위와 같이 쓰고 사전을 가지고 가면 키워드 매개 변수로 흩어집니다. 이럴 때 ensure 를 쓸 수 있습니다.ascii':False입니다. 그의 역할은 중국어 문자가 바이트로 직접 부호화되지 않도록 하는 것입니다.
이제 다음 작업을 수행합니다.
l = [1,2,3,4,5,5,6] return Json Response(l) 결과는 틀렸다
오류 메시지
TypeError at/index/In order to allow non-dict objects to be serialized set the safe parameter to False. "비dict 객체를 시리얼화할 수 있도록 보안 매개 변수를 False로 설정하십시오."그럼 저희가 가서 설치를 하면 되겠네요.
l=[1,2,3,4,5,5,6] 리턴Json Response(l,safe=False)는 이때 잘못 보고하지 않는다.
총결산
이 두 가지는 모두django에서 백엔드에서 프론트 데스크톱에 데이터를 되돌려 주는 방법이고 http 프로토콜로 간다
구별하다
Http Response는 백엔드에서 서열화와 반서열화를 해야 한다. Jason Response는 서열화와 반서열화를 봉하여 서열화 가능한 문자열을 프론트에 전송하면 대응하는 데이터를 받을 수 있다.백엔드 return Http Response(json.dumps(객체) return Jason Response(객체)
프런트엔드 js 역서열화res=JSON.parse(data); JSON을 시리얼화합니다.stringify(res) Jason Response가 직접 되돌아오는 값은 대응하는 데이터 형식입니다. 과도한 조작이 필요 없고 사전에서 대상점 방법을 할 수 있습니다.
인코딩 문제 해결:
return Json Response(data, json dumps params={'ensure ascii':False}) Jason Response는 기본적으로 서열화된 사전을 지원합니다. 다른 종류(json이 지원할 수 있는 종류)를 서열화하려면 safe 매개 변수의 기본 True를 False로 변경하십시오

좋은 웹페이지 즐겨찾기