Django REST Framework后端如何解析React Native传入的字典对象
问题原因说明
你解析失败的核心问题有两个:
- 方法使用错误:
json.dump()/json.dumps()是将Python字典序列化为JSON字符串的方法,你需要的是把字符串转为Python对象的反序列化操作,应该使用json.loads() - 内容存在HTML转义:你收到的
user字段值是经过HTML实体编码的字符串,"是双引号"的HTML编码格式,直接解析会报错,需要先完成反转义处理。
基础解析方案
直接在DRF视图中手动处理即可,代码示例如下:
import json import html from rest_framework.views import APIView from rest_framework.response import Response class PushDataReceiveView(APIView): def post(self, request): # 1. 取原始请求数据 raw_data = request.data # 2. 直接提取pushToken,本身就是标准字典结构 push_token = raw_data.get("pushToken") # 可单独提取type和data值 push_type = push_token.get("type") push_value = push_token.get("data") # 3. 处理user字段:先反转义再反序列化 escaped_user_str = raw_data.get("user") # 把HTML实体编码转回正常字符 normal_user_str = html.unescape(escaped_user_str) # 把JSON字符串转为Python字典 user_info = json.loads(normal_user_str) # 直接提取user内的字段 user_token = user_info.get("token") user_id = user_info.get("user_id") username = user_info.get("username") email = user_info.get("email") # 后续业务逻辑处理 return Response({"status": "success", "msg": "解析完成"})
优化方案:用DRF序列化器自动处理
如果需要复用解析逻辑,可以自定义序列化器字段实现自动解析,代码更规范:
from rest_framework import serializers import json import html # 自定义user字段的解析逻辑 class HtmlEncodedJsonField(serializers.Field): def to_internal_value(self, data): unescaped_str = html.unescape(data) return json.loads(unescaped_str) # pushToken结构序列化器 class PushTokenSerializer(serializers.Serializer): type = serializers.CharField() data = serializers.CharField() # 完整请求结构序列化器 class RequestDataSerializer(serializers.Serializer): pushToken = PushTokenSerializer() user = HtmlEncodedJsonField()
在视图中直接调用序列化器即可完成自动解析:
def post(self, request): ser = RequestDataSerializer(data=request.data) ser.is_valid(raise_exception=True) valid_data = ser.validated_data # 直接取valid_data["pushToken"]和valid_data["user"]使用即可 return Response({"code": 0})
内容的提问来源于stack exchange,提问作者Luqman Arshad
相关产品推荐
相关产品推荐

