You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:36:03