我正在实现一个API(代理),它在Flask中接受传入的JSON POST数据。我需要处理这个JSON,然后将其发送到后端API,该API是用另一种语言编写的。
JSON数据将由最终用户发送,并且他们习惯于不区分大小写地发送此JSON数据。这意味着传入的JSON数据有时将具有大写键/节点,有时小写,有时可能是驼峰或Pascalcase。
我使用Flasks request.json
从请求中获取数据。它被解析为Python对象,但该对象将具有大小写敏感的键和值。这些也将被嵌套。
我目前如何获取数据的一个具体示例是:data['ORDERS']['authentication']['AccountToken']
但是我的用户可能会发布:
{
"Orders": {
"Authentication": {
"AccountToken": "C3485D7B"
},
...
有没有一种方法可以让data['ORDERS']['authentication']['AccountToken']
的完整路径不区分大小写?我知道我可以分别检查路径的每个部分,但这需要大量的开销代码才能到达正确的子节点。
我看到了其他的解决方案:Case insensitive dictionary
我也试过像这样使用requests
库中的CaseInsensitiveDict
:data = CaseInsensitiveDict(request.json)
,但这实际上只是使对象的第一级不区分大小写。
这些解决方案的问题是它们处理的是字典,而JSON数据是一个对象的字典,可以是列表或其他对象。提供的解决方案不是递归的,也不是只在字典上工作。
任何帮助都很感激。
2条答案
按热度按时间owfi6suc1#
这个函数输出一个不区分大小写的dict,为每个条目递归地创建它:
olqngx592#
你必须保留用户发送给你的大小写吗?如果不是,最好将你的输入整理成某种标准格式,而不是预先考虑你可能会发送的所有内容。你可以在输入时将所有键转换为普通小写,而不是不区分大小写地检查你的路径,例如:
这不需要很多样板文件,并且允许您在内部保持相同的路径。