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

时间:2017-08-10 12:00:11

标签: python arrays json flask flask-restful

这是我的代码:

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]

2 个答案:

答案 0 :(得分:1)

中阮在他对你的问题的评论中是对的。举一个例子:

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"
    ]
}

答案 1 :(得分:0)

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

通过扩展输入类型,您可以创建自己的"数组类型"那样:

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")

它有效,但我认为应该有一个正确的方法在平静的环境中做到这一点 - 宁静。我想为每个JSON数组调用request.get_json()在性能方面也不是最好的,特别是如果请求数据相当大的话。