Измените имя ключа свойства json в рекурсивном javascript для сохранения в виде json в PostgreSQL

#javascript #json #postgresql

#javascript #json #postgresql

Вопрос:

Я пытаюсь сохранить объект JSON в таблице PostgreSQL. Объекты JSON, которые у меня есть, имеют структуру, подобную:

 {
  "$base": "Object",
  "displayName": "Test_DC_CAL_78901234567890123456789012345678901234567890äöüßÄÖÜ",
  "object-name": {
    "$base": "String",
    "value": "Test_DC_CAL_78901234567890123456789012345678901234567890äöüßÄÖÜ"
  },
  "object-identifier": {
    "$base": "ObjectIdentifier",
    "value": "calendar,701001"
  },
  "object-type": {
    "$base": "Enumerated",
    "value": "calendar"
  },
  "description": {
    "$base": "String",
    "value": "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890äöüß"
  },
  "date-list": {
    "1": {
      "$base": "Choice",
      "date": {
        "$base": "Choice",
        "date": {
          "$base": "DatePattern",
          "value": "*-12-25-*"
        }
      }
    },
    "2": {
      "$base": "Choice",
      "date": {
        "$base": "Choice",
        "date": {
          "$base": "DatePattern",
          "value": "*-12-26-*"
        }
      }
    },
    "3": {
      "$base": "Choice",
      "weekNDay": {
        "$base": "Sequence",
        "month": {
          "$base": "Enumerated",
          "value": "any"
        },
        "weekOfMonth": {
          "$base": "Enumerated",
          "value": "any"
        },
        "dayOfWeek": {
          "$base": "Enumerated",
          "value": "sunday"
        }
      }
    },
    "4": {
      "$base": "Choice",
      "date": {
        "$base": "Choice",
        "date": {
          "$base": "Date",
          "value": "2020-10-15"
        }
      }
    },
    "5": {
      "$base": "Choice",
      "dateRange": {
        "$base": "Sequence",
        "startDate": {
          "$base": "Date",
          "value": "2020-10-16"
        },
        "endDate": {
          "$base": "Date",
          "value": "2020-10-17"
        }
      }
    },
    "$base": "List"
  },
  "present-value": {
    "$base": "Boolean",
    "value": "1"
  }
}
  

Мой соединитель postgres не принимает свойства $base. Я могу удалить его, но только по свойству. Но позже мне это снова понадобится, поэтому я ищу способ переименовать его на всех уровнях свойств.

Ответ №1:

JSON.parse() может вызываться с reviver параметром для внесения простых изменений в дерево объектов сразу после его анализа из JSON. Переименовать все $base ключи в _base :

 const parsed = JSON.parse(json, function (key, value) {
  if (key === "$base") {
    // Rename key
    this._base = value;
    // Drop old key
    return undefined;
  }
  return value;
});