网站搜索

javascript - 以不区分大小写的方式反序列化 JSON 的好方法


我只是在尝试做世界上最微不足道的事情,但在解析来自各种旧设备的不一致大小写的数据时遇到了问题。

我正在尝试在 TypeScript 中解析以下 JSON

{
    "property": 5
}

对

{
   "Property": 5
}

我能想到的最好的答案就是字面上遍历对象的键并对它们运行“toUpper”,但是否有一个不错的 NPM 包(像 json-typescript-mapper,但不区分大小写)可以让我反序列化对象,而不必遍历对象键并手动提取值或编写大量样板代码

我想把 JSON 解析为一个统一的对象结构,比如 { property },这样我就可以在不需要大量条件检查名称变体的情况下访问它

答案#1

一种方法是编写自定义的 reviver 函数,作为 JSON.parse 的第二个参数,将普通对象的键转换为小写:

const json = `{"Property": 5,"inner":{"Foo":"foo"}}`;
const obj = JSON.parse(
  json,
  (_, val) => {
    if (Array.isArray(val) || typeof val !== 'object') {
      return val;
    }
    return Object.entries(val).reduce((a, [key, val]) => {
      a[key.toLowerCase()] = val;
      return a;
    }, {});
  }
);
console.log(obj);

答案#2

一个更现代的选择是:

请注意,原始键名称相同但大小写不同的情况会被合并,并保留最新的条目。

const toLowerCaseObject = (input) => Object.fromEntries(Object.entries(input).map(([a,b]) => [a.toLocaleLowerCase(), b]));

console.log(JSON.stringify(toLowerCaseObject({A: 11, b: 12, B: 1})));