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})));