JSON 처리 |
import json
myData = { "squadName": "Super hero squad", "homeTown": "Metro City", "formed": 2016, "secretBase": "Super tower", "active": True, "members": [ { "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": [ "Radiation resistance", "Turning tiny", "Radiation blast" ] } ] }
print(type(myData)) # <class 'dict'>
myDataJson = json.dumps(myData) print(type(myDataJson)) # <class 'str'>
myDataReturn = json.loads(myDataJson) print(type(myDataReturn)) # <class 'dict'> |
ModelSerializer 를 통한 JSON 직렬화 예제 |
참조) https://ssungkang.tistory.com/entry/Django-django-rest-framework-%EB%A5%BC-%EC%9C%84%ED%95%9C-JSON-%EC%A7%81%EB%A0%AC%ED%99%94?category=320582
# models.py from django.db import models
class Post(models.Model): title = models.CharField(max_length=100) message = models.TextField() created_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True)
# serializers.py from rest_framework import serializers from .models import Post
class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = '__all__'
# config/urls.py from django.contrib import admin from django.urls import path, include
urlpatterns = [ path('admin/', admin.site.urls), path('core/', include('core.urls'), name='core'), ]
# core/urls.py from django.urls import path, include from rest_framework.routers import DefaultRouter from . import views
router = DefaultRouter() router.register(r'posts', views.PostViewSet)
urlpatterns = [ path('', include(router.urls)), ]
# views.py from django.shortcuts import render from rest_framework import viewsets from .models import Post from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer
serializer = PostSerializer(post) serializer.data
# {'id': 2, 'title': '제목 내용', 'message': '메세지 내용', 'created_at': '2019-11-18T18:52:57.489893Z', 'update_at': '2019-11-18T19:22:53.717588Z'} type(serializer.data) # <class 'rest_framework.utils.serializer_helpers.ReturnDict'>
serializer = PostSerializer(Post.objects.all()) serializer.data # 오류
serializer = PostSerializer(Post.objects.all(), many=True) serializer.data # [OrderedDict([('id', 2), ('title', '제목 내용'), ('message', '메세지 내용'), ('created_at', '2019-11-18T18:52:57.489893Z'), ('update_at', '2019-11-18T19:22:53.717588Z')]), OrderedDict([('id', 3), ('title', '임시제목'), ('message', 'ㅡㅏㅏ'), ('created_at', '2019-11-18T18:52:57.489893Z'), ('update_at', '2019-11-18T18:52:57.499208Z')])] type(serializer.data) <class 'rest_framework.utils.serializer_helpers.ReturnList'>
뷰에서의 JSON 응답 ) from django.core.serializers.json import DjangoJSONEncoder from django.db.models.query import QuerySet
# QuerySet 타입에 대해서는 tuple로 변환 # Post 타입에 대해서는 dict로 변환 # 그 외에는 DjangoJSONEncoder 로 변환 class MyJSONEncoder(DjangoJSONEncoder): def default(self, obj): if isinstance(obj, QuerySet): return tuple(obj) elif isinstance(obj, Post): return {'id':obj.id, 'title': obj.title, 'message': obj.message } return super().default(obj)
# View 에서 json 리턴 from django.http import JsonResponse
data = Post.objects.all() # 직렬화할 QuerySet encoder = MyJSONEncoder # DjangoJSONEncoder를 커스튬한 Encoder safe = False # default = True 로서 변환할 데이터의 타입이 dict인지 확인합니다. dict 가 아닐 경우에는 False로 설정해주어야 합니다. QuerySet 은 dict 타입이 아니므로 False로 설정합니다. json_dumps_params = {'ensure_ascii':False} # 한글 등의 유니코드는 16진수로 표현되므로 이를 False 로 바꿔주면 한글문자가 그대로 출력됩니다. kwargs = {}
response = JsonResponse(data, encoder, safe, json_dumps_params, **kwargs)
response # response.content.decode('utf8') # [{"id": 2, "title": "제목 내용", "message": "메세지 내용"}, {"id": 3, "title": "임시제목", "message": "ㅡㅏㅏ"}]
|