在 python 中,我從資料庫收到以下資料結構:
{
"field":"Somestring/somestring.jpg?<<TOKEN>>",
"list": [
{"field": "sometring.html?<<TOKEN>>"},
{"field2": "otherstring.mp4?<<TOKEN>>"}
]
}
并且這種結構很可能會擴展到包含更多帶有欄位的串列。
我希望替換出現在整個資料結構中不同字串中的所有“<<TOKEN>>”實體,并使用其他中使用的驗證令牌來訪問這些字串表示的 url。
有沒有更好的方法來做到這一點,而不是用回圈訪問每個欄位,檢查它是否是一個字串,然后運行: field.replace("<<TOKEN>>", my_token)
uj5u.com熱心網友回復:
遞回方法
這就像一個步行者,進入資料結構的每個級別并應用處理正確型別的治愈方法。這讓您也可以處理特殊情況或特定資料型別。
var = {
"field":"Somestring/somestring.jpg?<<TOKEN>>",
"list": [
{"field": "sometring.html?<<TOKEN>>"},
{"field2": "otherstring.mp4?<<TOKEN>>"}
]
}
def replacer(obj, val:str):
if isinstance(obj, str):
return obj.replace('<<TOKEN>>', val)
if isinstance(obj, list):
return [replacer(x,val) for x in obj]
if isinstance(obj, dict):
return {k:replacer(x,val) for k,x in obj.items()}
# other cases
#if ...
return obj
replacer(var, 'ciao')
#{'field': 'Somestring/somestring.jpg?ciao',
# 'list': [{'field': 'sometring.html?ciao'},
# {'field2': 'otherstring.mp4?ciao'}]}
使用序列化程式
正如@Mahrkeenerh (kudos) 所說,這是一個技巧,json-fied 版本也是一個字串,因此執行單個替換的結果會更好。
序列化 -> 治愈 -> 反序列化
import json
json.loads(json.dumps(var).replace('<<TOKEN>>', 'ciao'))
#{'field': 'Somestring/somestring.jpg?ciao',
# 'list': [{'field': 'sometring.html?ciao'},
# {'field2': 'otherstring.mp4?ciao'}]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341422.html
