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

Flask RESTful API解析JSON时如何转换Unicode字典列表为Python正常结构

解决Flask-RESTful reqparse解析嵌套JSON数组的问题

你这是踩了reqparse的一个常见小坑——action='append'压根不是用来解析JSON请求体里的数组结构的,它原本是给重复的表单/URL参数设计的(比如Order=xxx&Order=yyy这种多参数重复的场景)。所以当你发送JSON格式的数组时,它会把每个元素都当成纯字符串解析,就出现了你看到的[u"{u'Menu_Id':...}", ...]这种奇怪的字符串列表。

下面给你两种解决方案,优先推荐第一种从根源解决的方式:

方案一:用嵌套Parser正确解析JSON数组

我们可以先定义一个子Parser来规范单个订单项的结构,再让主Parser用这个子Parser去解析数组里的每个元素,既能正确解析出字典列表,还能做字段校验:

from flask_restful import reqparse

# 先定义单个订单项的解析规则
order_item_parser = reqparse.RequestParser()
order_item_parser.add_argument('Menu_Id', type=int, required=True, help='Menu ID不能为空')
order_item_parser.add_argument('Menu_Price', type=float, required=True, help='菜单价格不能为空')
order_item_parser.add_argument('Order_ItemQty', type=int, required=True, help='商品数量不能为空')

# 定义主解析器
UserOrdersparser = reqparse.RequestParser()
# 用lambda遍历Order数组,每个元素都用子parser解析成字典
UserOrdersparser.add_argument(
    'Order',
    type=lambda items: [order_item_parser.parse_args(item) for item in items],
    required=True,
    help='This field cant be left blank!'
)
UserOrdersparser.add_argument('User_Id', type=int, required=True, help='This field cant be left blank!')

# 解析请求
json_payload = UserOrdersparser.parse_args()
# 现在就能正常访问字典值了
print(json_payload['Order'][0]['Menu_Id'])  # 输出1

方案二:手动转换已解析的字符串列表(临时应急)

如果你暂时不想调整解析规则,也可以用ast.literal_eval把字符串形式的字典转换成真实字典(别用eval(),不安全):

import ast

json_payload = UserOrdersparser.parse_args()
# 把Order列表里的每个字符串转成字典
converted_order = [ast.literal_eval(item) for item in json_payload['Order']]
# 现在就能正常访问了
print(converted_order[0]['Menu_Id'])  # 输出1

不过这种方法属于事后补救,没法对订单项的字段做类型和必填校验,还是优先用方案一更稳妥。

内容的提问来源于stack exchange,提问作者Kenneth Macharia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:17:08