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

Java中如何将带复合键的键值结构映射为JSON对象

把带分隔符的复合键映射为嵌套JSON的简便实现方法

当然有啦!这种把点分隔的复合键转成嵌套JSON的需求非常常见,我给你分享几种不同编程语言里的简便实现方式,核心思路都是一致的:拆分复合键、逐层构建嵌套对象、最后给最内层的键赋值。

JavaScript实现

这是前端和Node.js环境下很实用的写法,用循环就能轻松搞定:

function convertToNestedObj(flatObj) {
  const result = {};
  // 遍历所有键值对
  for (const [fullKey, value] of Object.entries(flatObj)) {
    const keySegments = fullKey.split('.');
    let currentLayer = result;
    // 逐层处理键的每一段
    for (let i = 0; i < keySegments.length; i++) {
      const segment = keySegments[i];
      // 如果是最后一段,直接赋值
      if (i === keySegments.length - 1) {
        currentLayer[segment] = value;
      } else {
        // 如果当前层没有这个键,就创建空对象
        currentLayer[segment] = currentLayer[segment] || {};
        // 进入下一层
        currentLayer = currentLayer[segment];
      }
    }
  }
  return result;
}

// 测试示例
const dbData = {
  'stackoverflow.questions.ask': '你的问题答案在这里',
  'stackoverflow.answers.accept': '选最有用的回答'
};

console.log(convertToNestedObj(dbData));

Python实现

Python可以借助functools.reduce来简化代码,一行核心逻辑就能完成嵌套构建:

from functools import reduce

def convert_to_nested_obj(flat_dict):
    result = {}
    for full_key, value in flat_dict.items():
        key_segments = full_key.split('.')
        # 用reduce逐层获取或创建嵌套字典,最后给最后一段键赋值
        reduce(lambda d, seg: d.setdefault(seg, {}), key_segments[:-1], result)[key_segments[-1]] = value
    return result

# 测试示例
db_data = {
    'stackoverflow.questions.ask': '你的问题答案在这里',
    'stackoverflow.answers.accept': '选最有用的回答'
}

print(convert_to_nested_obj(db_data))

核心逻辑说明

不管用哪种语言,核心步骤都是这三步:

  1. 将复合键按分隔符(这里是.)拆分成字符串数组
  2. 从顶层对象开始,逐层检查并创建嵌套的子对象
  3. 到达键的最后一段时,将对应的值赋值给这个键

如果你的数据库里有多个同前缀的复合键,比如stackoverflow.questions.view和stackoverflow.questions.ask,这些方法会自动把它们合并到同一个questions对象下,不会出现覆盖问题。

内容的提问来源于stack exchange,提问作者WildWind03

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:59:57