如何在TypeScript中将JSON属性解析为嵌套Map的键?
解决JSON转三层嵌套Map的问题
问题分析
你当前的两种尝试都存在核心问题:
- 第一种方法的接口定义完全不符合JSON的实际结构,JSON根节点直接是
DDBProps、DDBProps2这类键,不存在throughputMappings字段,所以解析后该属性自然为undefined。 - 第二种方法仅将最外层对象转为
Map,但内层的区域、环境对象仍然是普通JS对象,无法调用Map的get()方法。
正确实现方式
要构建Map<string, Map<string, Map<string, string>>>结构,需要逐层将JSON解析出的普通对象转换为Map,可以通过递归函数实现嵌套转换:
1. 编写转换函数
function objectToNestedMap(obj: Record<string, any>): Map<string, any> { const map = new Map<string, any>(); for (const [key, value] of Object.entries(obj)) { // 如果值是对象,则递归转换为Map;否则直接存入 if (typeof value === 'object' && value !== null && !Array.isArray(value)) { map.set(key, objectToNestedMap(value)); } else { map.set(key, value); } } return map; }
2. 解析并转换JSON
const jsonString = `{ "DDBProps": { "us-east-1": { "test": "2", "prod": "100" }, "us-west-2": { "test": "2", "prod": "100" } }, "DDBProps2": { "us-east-1": { "test": "2", "prod": "200" }, "us-west-2": { "test": "2", "prod": "200" } } }`; // 先解析JSON为普通对象,再转换为嵌套Map const parsedObj = JSON.parse(jsonString); const ddbScaleMap: Map<string, Map<string, Map<string, string>>> = objectToNestedMap(parsedObj) as Map<string, Map<string, Map<string, string>>>;
3. 使用示例
现在可以通过连续调用get()获取目标值:
// 获取DDBProps下us-west-2环境的prod值 const value = ddbScaleMap.get("DDBProps")?.get("us-west-2")?.get("prod"); console.log(value); // 输出 "100" // 获取DDBProps2下us-east-1环境的prod值 const value2 = ddbScaleMap.get("DDBProps2")?.get("us-east-1")?.get("prod"); console.log(value2); // 输出 "200"
类型说明
如果需要更严格的类型约束,可以给转换函数添加泛型,但上述as断言在明确JSON结构的场景下已经足够安全。
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

