我使用 djangorestframework 生成 API,我的 Serializer 为:
from rest_framework import serializers
class MarketSerializer(serializers.Serializer):
total_market_cap = serializers.FloatField(read_only=True)
volume = serializers.FloatField(required=False)
turnover_rate = serializers.FloatField(required=False)
pe = serializers.FloatField(required=False)
class MarketOverallSerializer(serializers.Serializer):
# markets = MarketSerializer(many=True) # A nested list of 'edit' items.
sh = MarketSerializer()
sz = MarketSerializer()
cyb = MarketSerializer()
zxb = MarketSerializer()
我的 APIView 为:
import json
from django.shortcuts import render
# Create your views here.
from rest_framework.renderers import JSONRenderer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from serializers import MarketSerializer, MarketOverallSerializer
from market.models import Market
from market.parse import *
class MarketView(APIView):
def get(self, request, *args, **kw):
# Process any get params that you may need
# If you don't need to process get params,
# you can skip this part
market = market_overall()
serializer = MarketOverallSerializer(market)
content = JSONRenderer().render(serializer.data)
print '**********content:{}'.format(content)
response = Response(content, status=status.HTTP_200_OK)
return response
我得到 JSON 响应:
"{\"sh\":{\"total_market_cap\":262143.47,\"volume\":25240015.73,\"turnover_rate\":0.84,\"pe\":15.8},\"sz\":{\"total_market_cap\":0.0,\"volume\":0.0,\"turnover_rate\":0.0,\"pe\":0.0},\"cyb\":null,\"zxb\":null}"
为什么生成的响应不是有效的 JSON 输出,有这么多“\”字符?
最佳答案
原因是 DRF 中的默认渲染器是 json(引用:http://www.django-rest-framework.org/api-guide/renderers/#setting-the-renderers)。
所以每次你使用DRF的Response
你应该直接传递dict而不是渲染的json。
在您的情况下,通过一次又一次地呈现 json(通过使用 Response
),json 内置模块转义特殊字符并将其视为单个字符串(这就是为什么 json.loads( )
返回正确的 json)
所以修复它的方法是:
- 不要使用
JSONRenderer
,直接将字典传递给Response
- 删除
JSONRenderer
,然后专门告诉Response
使用text/html
作为内容类型。
关于python - 为什么 django rest 框架返回无效的 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32546832/