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
相关产品推荐
相关产品推荐

