从传入的Flask请求中获取json数据,json不区分大小写

ovfsdjhp  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(156)

我正在实现一个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库中的CaseInsensitiveDictdata = CaseInsensitiveDict(request.json),但这实际上只是使对象的第一级不区分大小写。
这些解决方案的问题是它们处理的是字典,而JSON数据是一个对象的字典,可以是列表或其他对象。提供的解决方案不是递归的,也不是只在字典上工作。
任何帮助都很感激。

owfi6suc

owfi6suc1#

这个函数输出一个不区分大小写的dict,为每个条目递归地创建它:

from requests.structures import CaseInsensitiveDict

def case_insensitive_copy(data):
    if not isinstance(data, dict):
       return data
    temp_dict = {}
    for key, value in data.items():
       temp_dict[key] = case_insensitive_copy(value)
    return CaseInsensitiveDict(temp_dict)

d = { "Orders": {
    "Authentication": {
        "AccountToken": "C3485D7B"
         }
      }
    }

d = case_insensitive_copy(d)
print(d['ORDERS']['authentication']['AccountToken'])
>>> C3485D7B
olqngx59

olqngx592#

你必须保留用户发送给你的大小写吗?如果不是,最好将你的输入整理成某种标准格式,而不是预先考虑你可能会发送的所有内容。你可以在输入时将所有键转换为普通小写,而不是不区分大小写地检查你的路径,例如:

def make_all_keys_lowercase(d: dict) -> None:
    for k, v in d.items():
        if type(v) == dict:
            d[k] = make_all_keys_lowercase(v)
        d[k.lower()] = d.pop(k)

这不需要很多样板文件,并且允许您在内部保持相同的路径。

相关问题