剛接手的專案JSON設定檔有重複的Key值, 造成結果不如預期。
網上搜尋工具竟然沒有檢查JSON重複Key值,趁空閒手動寫個小工具布到Cloudflare Pages。
如果直接JSON.parse()有重複Key值的字串,產生的JSON只會包含最後一個重複Key。
以下面這個字串為例:
JavaScript
let jsonStr = `{
"Key1":"Val1",
"Key2":"Val2",
"Key3":"Val3",
"Key2":"Val4"
}`;
JSON.parse(jsonStr);
經過JSON.parse()轉為物件後”Key2″:”Val2″這對屬性值就會消失:
JSON
{
"Key1": "Val1",
"Key2": "Val4",
"Key3": "Val3"
}
因此,檢查JSON重複Key值的邏輯為:
- 用regex從字串一次取一對屬性及值,
- 分別建立Key及Value物件用來儲存字串取出的屬性及值,
- 每次取到字串屬性時到Key物件找此Key屬性;
- 不存在新增此Key為屬性並設值為0,在Value物件也新增此Key為屬性並設值為陣列,將字串值加入到陣列
- 存在則在此Key屬性 + 1,將字串值加入到Value物件對應此Key屬性值陣列。
- 最後從Key物件印出在字串中屬性重複次數,以及從Value物件印出重複屬性的值。
檢查JSON重複Key值的程式碼
JavaScript
// 用正則表達式解析 JSON 中的 key 和 value
const keyValueRegex = /"([^"]+)"\s*:\s*([^,}]+)/g;
let match;
const keyValues = {}; // 用來記錄每個 key 和它對應的所有 value
const keyCount = {}; // 計每個 key 出現的次數
// 循環找所有的 key 和它們的 value
while ((match = keyValueRegex.exec(inputText)) !== null) {
const key = match[1];
const value = match[2].trim(); // 取 value 值,並去掉多餘空白字元
// 如果 key 已存在,累加它的出現次數,並記錄其 value
if (keyCount[key]) {
keyCount[key] += 1;
keyValues[key].push(value);
} else {
// 如果 key 是第一次出現,初始化計數和對應的 value 物件
keyCount[key] = 1;
keyValues[key] = [value];
}
}
找出重覆的屬性,並顯示他們對應的屬性
JavaScript
for (const key in keyCount) {
if (keyCount[key] > 1) {
this.duplicateJson += `${key}, Occurrences/出現次數: ${keyCount[key]}\n---\n`;
keyValues[key].forEach(value => {
this.duplicateJson += `"${key}": ${value}\n`;
});
this.duplicateJson += '\n'; // 添加換行字元以便區分每個重覆的 key
}
}
本文於2024-09-28發布至 iT邦幫忙
最後更新日期:2024-11-18
發佈留言