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))
核心逻辑说明
不管用哪种语言,核心步骤都是这三步:
- 将复合键按分隔符(这里是
.)拆分成字符串数组 - 从顶层对象开始,逐层检查并创建嵌套的子对象
- 到达键的最后一段时,将对应的值赋值给这个键
如果你的数据库里有多个同前缀的复合键,比如stackoverflow.questions.view和stackoverflow.questions.ask,这些方法会自动把它们合并到同一个questions对象下,不会出现覆盖问题。
内容的提问来源于stack exchange,提问作者WildWind03
相关产品推荐
相关产品推荐

