RESTful-Flask 使用 parse_args() 解析 JSON 数组

Posted

技术标签:

【中文标题】RESTful-Flask 使用 parse_args() 解析 JSON 数组【英文标题】:RESTful-Flask parsing JSON Arrays with parse_args() 【发布时间】:2018-01-18 16:05:24 【问题描述】:

这是我的代码:

parser = reqparse.RequestParser(bundle_errors=True)    
parser.add_argument('list', type=list, location="json")

class Example(Resource):
    def post(self):
        #json_data = request.get_json(force=True)
        json_data = parser.parse_args()
        return json_data

如果我发布这样的 JSON 对象:


  "list" : ["ele1", "ele2", "ele3"]

parser.parse_args() 将其解析为这个 python 列表:

'list': ['e','l','e','1']

request.get_json() 有效,但我真的很想验证 reqparser... 如何让parser.parse_args() 与 JSON 数组一起正常工作?

(我收到此错误:TypeError("'int' object is not iterable",) is not JSON serializable,如果 JSON 数组包含整数:'list': [1, 2, 3]

【问题讨论】:

可以使用option action='append',类似***.com/questions/27758470/… 【参考方案1】:

chuong nguyen 对您的问题的评论是正确的。举个例子:

def post(self):
    parser = reqparse.RequestParser()
    parser.add_argument('options', action='append')
    parser = parser.parse_args()
    options = parser['options']

    response = 'options': options
    return jsonify(response)

有了这个,如果你要求:

curl -H 'Content-type: application/json' -X POST -d '"options": ["option_1", "option_2"]' http://127.0.0.1:8080/my-endpoint

响应是:


    "options": [
      "option_1",
      "option_2"
    ]

【讨论】:

【参考方案2】:

这是一个解决方法。但这对我来说真的像是一个大黑客......

通过扩展输入类型,您可以像这样创建自己的“数组类型”:

from flask import request

def arrayType(value, name):
    full_json_data = request.get_json()
    my_list = full_json_data[name]
    if(not isinstance(my_list, (list))):
        raise ValueError("The parameter " + name + " is not a valid array")
    return my_list

然后将它与解析器一起使用:

parser = reqparse.RequestParser(bundle_errors=True)
parser.add_argument('list', type=arrayType, location="json")

它有效,但我认为在 flaks-restful 中应该有一种适当的方法来做到这一点。我想为每个 JSON 数组调用 request.get_json() 在性能方面也不是最好的,尤其是在请求数据相当大的情况下。

【讨论】:

以上是关于RESTful-Flask 使用 parse_args() 解析 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”