Python中处理多字段JSON解析异常的最Pythonic实现方式
最优方案1:配置映射法(无框架依赖)
核心思路是把每个key的个性化处理逻辑抽为配置项,一次遍历同时完成校验、解析、后处理,避免重复执行json.loads,也不用分散写多段重复逻辑。
import json from rest_framework import serializers # 结构:{key: (默认解析值, 后处理函数)} KEY_PROCESS_RULES = { "key1": ("", lambda loaded: loaded), "key2": ("[]", lambda loaded: [item for item in loaded]), "key3": ("", lambda loaded: [loaded]), "key4": ("", lambda loaded: [loaded]), }
处理逻辑:
for key, (load_default, processor) in KEY_PROCESS_RULES.items(): raw_value = normalize_data.get(key) # 先判断字段是否缺失 if raw_value is None: raise serializers.ValidationError({"error": f"Field {key} is missing"}) # 一次完成解析+后处理,同时捕获两类异常 try: loaded_value = json.loads(raw_value) normalize_data[key] = processor(loaded_value) except (json.JSONDecodeError, TypeError): raise serializers.ValidationError({"error": f"Wrong format of {key}"})
该方案优势:
- 可维护性强:所有key的处理规则集中管理,新增/修改规则只需要调整配置字典,无需修改核心处理逻辑
- 性能更好:相比原方案两次调用
json.loads,该方案只执行一次解析 - 逻辑内聚:字段校验和业务处理合并,不会出现校验和实际处理逻辑不一致的问题
最优方案2:DRF序列化器方案(适配你当前用的DRF场景)
你已经在使用DRF的ValidationError,更符合生态最佳实践的方式是直接用DRF序列化器托管所有校验和处理逻辑,无需自己手写遍历判断:
from rest_framework import serializers class NormalizeDataSerializer(serializers.Serializer): # JSONField自带json格式校验、缺失校验能力 key1 = serializers.JSONField() key2 = serializers.JSONField() key3 = serializers.JSONField() key4 = serializers.JSONField() # 针对每个字段做自定义后处理 def validate_key2(self, value): return [item for item in value] def validate_key3(self, value): return [value] def validate_key4(self, value): return [value]
使用时仅需两行代码:
serializer = NormalizeDataSerializer(data=normalize_data) # 自动抛出格式/缺失对应的ValidationError,符合你原有的异常逻辑 serializer.is_valid(raise_exception=True) # 处理后的数据直接从validated_data取 normalize_data = serializer.validated_data
这个方案完全复用DRF的原生能力,不需要自己维护校验逻辑,是DRF场景下最Pythonic的实现。
内容的提问来源于stack exchange,提问作者million
相关产品推荐
相关产品推荐

