Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从URL参数解析部分响应的分隔字段名和嵌套字段名_Python_Flask Restful_Pyparsing_Marshmallow_Webargs - Fatal编程技术网

Python 从URL参数解析部分响应的分隔字段名和嵌套字段名

Python 从URL参数解析部分响应的分隔字段名和嵌套字段名,python,flask-restful,pyparsing,marshmallow,webargs,Python,Flask Restful,Pyparsing,Marshmallow,Webargs,在基于Flask RESTful的API中,我希望允许客户端通过字段=…参数部分检索JSON响应。它列出了字段名(JSON对象的键),这些字段名将用于构建较大原始文件的部分表示 最简单的形式可能是逗号分隔的列表: GET /v1/foobar?fields=name,id,date 这可以通过webargs的schema字段轻松完成,对我来说并不麻烦 但是,为了允许表示嵌套的对象键,分隔字段列表可以包括包含在匹配括号中的任意嵌套键: GET/v1/foobar?字段=名称、id、另一个(名称

在基于
Flask RESTful
的API中,我希望允许客户端通过
字段=…
参数部分检索JSON响应。它列出了字段名(JSON对象的键),这些字段名将用于构建较大原始文件的部分表示

最简单的形式可能是逗号分隔的列表:

GET /v1/foobar?fields=name,id,date
这可以通过webargs的schema字段轻松完成,对我来说并不麻烦


但是,为了允许表示嵌套的对象键,分隔字段列表可以包括包含在匹配括号中的任意嵌套键:

GET/v1/foobar?字段=名称、id、另一个(名称、id)、日期
{
“名称”:“,
“id”:“,
“另一个”:{
“名称”:“,
“id”:”
},
“日期”:”
}
GET/v1/foobar?字段=id,一(id,二(id,三(id),日期)),日期
{
“id”:“,
“一”:{
“id:”,
“二”:{
“id”:“,
“三”:{
“id”:”
},
“日期”:”
}
},
“日期”:”
}
GET/v1/foobar?fields=just(me)
{
“公正”:{
“我:”
}
}

我的问题有两个方面:

  • 有没有一种方法可以通过
    webargs
    marshmallow
    本地实现(验证和反序列化)

  • 如果不是,我将如何使用像
    pyparsing
    这样的解析框架来实现这一点?任何关于BNF语法应该是什么样子的提示都将受到高度赞赏


  • Pyparsing有两个有用的内置组件,
    delimitedList
    nestedExpr
    。下面是一个带注释的代码段,它为您的值构建了一个解析器。(我还提供了一个示例,其中列表元素可能不仅仅是简单的字母词):

    给出:

    GET /v1/foobar?fields=name,id,date
    ['name', 'id', 'date']
    GET /v1/foobar?fields=name,id,another(name,id),date
    ['name', 'id', ['another', ['name', 'id']], 'date']
    GET /v1/foobar?fields=id,one(id,two(id,three(id),date)),date
    ['id', ['one', ['id', ['two', ['id', ['three', ['id']], 'date']]]], 'date']
    GET /v1/foobar?fields=just(me)
    [['just', ['me']]]
    GET /v1/foobar?fields=numbers(1,2,3.7,-26e10)
    [['numbers', [1, 2, 3.7, -260000000000.0]]]
    

    非常感谢@PaulMcG,这才是我真正需要的!现在,我将尝试将其集成到自定义webargs模式中-并将我的头脑集中在移位运算符上。。。
    parser.runTests("""
        GET /v1/foobar?fields=name,id,date
        GET /v1/foobar?fields=name,id,another(name,id),date
        GET /v1/foobar?fields=id,one(id,two(id,three(id),date)),date
        GET /v1/foobar?fields=just(me)
        GET /v1/foobar?fields=numbers(1,2,3.7,-26e10)    
        """,  fullDump=False)
    
    GET /v1/foobar?fields=name,id,date
    ['name', 'id', 'date']
    GET /v1/foobar?fields=name,id,another(name,id),date
    ['name', 'id', ['another', ['name', 'id']], 'date']
    GET /v1/foobar?fields=id,one(id,two(id,three(id),date)),date
    ['id', ['one', ['id', ['two', ['id', ['three', ['id']], 'date']]]], 'date']
    GET /v1/foobar?fields=just(me)
    [['just', ['me']]]
    GET /v1/foobar?fields=numbers(1,2,3.7,-26e10)
    [['numbers', [1, 2, 3.7, -260000000000.0]]]