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