檢查JSON找出重複Key值

作者:

分類:

剛接手的專案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值的邏輯為:

  1. 用regex從字串一次取一對屬性及值,
  2. 分別建立Key及Value物件用來儲存字串取出的屬性及值,
  3. 每次取到字串屬性時到Key物件找此Key屬性;
  • 不存在新增此Key為屬性並設值為0,在Value物件也新增此Key為屬性並設值為陣列,將字串值加入到陣列
  • 存在則在此Key屬性 + 1,將字串值加入到Value物件對應此Key屬性值陣列。
  1. 最後從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
  }
}

檢查 JSON 重複 Key小工具
原始碼Github

本文於2024-09-28發布至 iT邦幫忙

最後更新日期:2024-11-18

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *