如何将字符串式YAML本地化内容转为嵌套JSON对象(PHP/JS优先)
刚好我之前处理过类似的本地化格式转换需求,这就给你分享PHP和JavaScript两种实现方案,完美解决点分隔键转嵌套JSON的问题!
JavaScript实现方案
首先我们需要一个核心函数,把扁平的键值对(YAML解析后的结果)转换成嵌套结构:
function flattenToNested(obj) { const result = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { // 把点分隔的键拆分成层级数组 const keys = key.split('.'); let current = result; for (let i = 0; i < keys.length; i++) { const segment = keys[i]; // 如果是最后一层,直接赋值 if (i === keys.length - 1) { current[segment] = obj[key]; } else { // 不存在的层级就创建空对象 current[segment] = current[segment] || {}; current = current[segment]; } } } } return result; }
示例使用(含文件读写)
如果需要直接处理YAML文件,可以借助js-yaml库解析(先通过npm install js-yaml安装):
const yaml = require('js-yaml'); const fs = require('fs'); // 读取YAML本地化文件 const yamlContent = fs.readFileSync('your-locale-file.yaml', 'utf8'); // 解析成扁平键值对对象 const flatLocale = yaml.load(yamlContent); // 转换为嵌套结构 const nestedLocale = flattenToNested(flatLocale); // 写入格式化后的JSON文件 fs.writeFileSync('your-target-file.json', JSON.stringify(nestedLocale, null, 2));
PHP实现方案
PHP版本的核心逻辑和JS一致,利用引用变量来逐层构建嵌套数组:
function flattenToNested(array $flatArray) { $nestedArray = []; foreach ($flatArray as $key => $value) { // 拆分键的层级 $segments = explode('.', $key); $current = &$nestedArray; foreach ($segments as $index => $segment) { if ($index === count($segments) - 1) { // 最后一层赋值 $current[$segment] = $value; } else { // 不存在的层级创建空数组 if (!isset($current[$segment]) || !is_array($current[$segment])) { $current[$segment] = []; } $current = &$current[$segment]; } } unset($current); // 释放引用,避免后续循环干扰 } return $nestedArray; }
示例使用(含文件读写)
如果需要直接处理YAML文件,可以使用Symfony的YAML组件(先通过composer require symfony/yaml安装):
require 'vendor/autoload.php'; use Symfony\Component\Yaml\Yaml; // 读取YAML文件 $yamlContent = file_get_contents('your-locale-file.yaml'); // 解析为扁平关联数组 $flatLocale = Yaml::parse($yamlContent); // 转换为嵌套结构 $nestedLocale = flattenToNested($flatLocale); // 写入格式化的JSON文件 file_put_contents('your-target-file.json', json_encode($nestedLocale, JSON_PRETTY_PRINT));
这两个方案都能高效处理2万条数据的转换,7种语言的文件可以批量循环处理即可,完全替代手动操作!
内容的提问来源于stack exchange,提问作者Giesburts
相关产品推荐
相关产品推荐

