我正在為技術用戶撰寫一些代碼,以傳遞帶有變數占位符的 JSON,并附有一個 dict 來定義每個變數。我想用這些值替換這些變數,最終需要將其放入 Python dict 中。想象一下,我從這個開始:
>>> json_in = """
{
"sidebar": {
"type": "sidebar",
"title": "<h1>Vulnerability Data</h1>",
"description": {md_html}
},
"widgets": [
{
"name": "Map",
"itemId": {item_id},
"showNavigation": false
}
]
}"""
>>> args = {'md_html': '<super_long_html_string>', 'item_id': 'abcdef12345'}
如果我嘗試使用類似 的格式json_in.format(**args),當它遇到第一個左花括號(在“側邊欄”之前)時,我只會得到一個 KeyError,該格式嘗試讀取。將花括號加倍format()可以將它們轉義到 中,但是這個 JSON 可能有數千行長,所以我真的不想讓人們對它進行大量的重新格式化。我想我可以嘗試在format(). 我必須避免從格式化字串中弄亂花括號,所以這似乎變得不必要地復雜。Python通常有簡單的解決方案,那么我錯過了什么?
我走的另一條路是首先將其創建為 Python dict。很容易搜索 JSONisms 并替換為 Python 等效項(例如:falseto False、trueto True)。而不是格式化字串 ( {item_id}),我只是使用變數 ( item_id) 來結束這樣的事情:
>>> md_html = '<super_long_html_string>'
>>> item_id = 'abcdef12345'
>>> dict_in = {
"sidebar": {
"type": "sidebar",
"title": "<h1>Vulnerability Data</h1>",
"description": md_html
},
"widgets": [
{
"name": "Map",
"itemId": item_id,
"showNavigation": False
}
]
}
問題是變數md_html和item_id在這個例子中是硬編碼的,我想接受用戶傳入的任何內容(參見args上面的字典)。如果我可以用占位符創建一個 dict 并用提供的輸入替換它們,那將解決我的問題。
uj5u.com熱心網友回復:
我會使用該jq庫來定義這樣的 JSON 模板。
import jq
json_in = """
{
"sidebar": {
"type": "sidebar",
"title": "<h1>Vulnerability Data</h1>",
"description": $md_html
},
"widgets": [
{
"name": "Map",
"itemId": $item_id,
"showNavigation": false
}
]
}"""
args = {'md_html': '<super_long_html_string>', 'item_id': 'abcdef12345'}
result = jq.compile(json_in, args=args).input("")
uj5u.com熱心網友回復:
檢查出的模板字串,如果你有控制權json_in。
from string import Template
json_in = """
{
"sidebar": {
"type": "sidebar",
"title": "<h1>Vulnerability Data</h1>",
"description": $md_html
},
"widgets": [
{
"name": "Map",
"itemId": $item_id,
"showNavigation": false
}
]
}"""
args = {'md_html': '<super_long_html_string>', 'item_id': 'abcdef12345'}
Template(json_in).substitute(args)
輸出
{
"sidebar": {
"type": "sidebar",
"title": "<h1>Vulnerability Data</h1>",
"description": <super_long_html_string>
},
"widgets": [
{
"name": "Map",
"itemId": abcdef12345,
"showNavigation": false
}
]
}
我想你會想要在字串周圍加上引號,我只是讓 json 盡可能接近你的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/397745.html
