You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:40:36