Node.js将目录树转换为JSON

3

期望的结果是什么?
我想将下面列出的目录结构转换为一个单独的JSON文件。 该目录结构包含JSON文件,应该包含在输出文件中。

限制条件:
Node.js

问题:
使用Node.js +模块 生成所需输出的好/高效方法是什么? 从逻辑上讲,必要的步骤是什么?

目录结构:

CMS/
├── en/
|   ├──brand_one/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_two/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_three/
|   |  ├──footer.json
|   |  ├──header.json
├── de/
|   ├──brand_one/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_two/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_three/
|   |  ├──footer.json
|   |  ├──header.json
├── fr/
|   ├──brand_one/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_two/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_three/
|   |  ├──footer.json
|   |  ├──header.json
├── es/
|   ├──brand_one/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_two/
|   |  ├──footer.json
|   |  ├──header.json
|   ├──brand_three/
|   |  ├──footer.json
|   |  ├──header.json

[...]

期望输出:

// content.json

{
  "en":[
    {
      "brand_one":{
        "footer":{
          "val": "value",
          [...]
        },
        "header":{
          "val": "value",
          [...]
        }
      },
      "brand_two":{
        "footer":{
          "val": "value",
          [...]
        },
        "header":{
          "val": "value",
          [...]
        }
      },
      "brand_three":{
        "footer":{
          "val": "value",
          [...]
        },
        "header":{
          "val": "value",
          [...]
        }
      }
    }
  ],
  [...]
}

1
在这里查看。https://dev59.com/UGgu5IYBdhLWcg3wnoWC - Doumor
3个回答

3

1
您可以创建一个函数,将目录转换为对象,每个目录/文件都有一个属性。
然后可以使用递归调用该函数来遍历整个树,在这种情况下使用fs/promises函数。
const fs = require('fs/promises'); 
const path = require('path');

async function walkDir(dir, result = {}) {
    let list = await fs.readdir(dir);
    for(let item of list) {
        const itemPath = path.join(dir, item);
        let stats = await fs.stat(itemPath)
        if (await stats.isDirectory()) {
            result[item] = {};
            await walkDir(itemPath, result[item]);
        } else {
            const fileName = path.basename(item, path.extname(item));
            result[fileName] = JSON.parse(await fs.readFile(itemPath, { encoding: 'utf-8'}));
        }
    }
    return result;
}

async function testWalkDir() {
    let result = await walkDir('./CMS')
    console.log("Result:", JSON.stringify(result, null, 2));
}

testWalkDir();

假设每个文件看起来都像这样。
{
  "some_key": "some_val"
}

我得到了一个看起来像这样的结果:
{
  "en": {
    "brand_one": {
      "footer": {
        "some_key": "some_val"
      },
      "header": {
        "some_key": "some_val"
      }
    },
    "brand_three": {
      "footer": {
        "some_key": "some_val"
      },
      "header": {
        "some_key": "some_val"
      }
    },
    "brand_two": {
      "footer": {
        "some_key": "some_val"
      },
      "header": {
        "some_key": "some_val"
      }
    }
  }
}



1
谢谢,这就是我寻找的答案。 - derp

0
你可以尝试这个模块: npm dree 示例代码:
const dree = require('dree');

const options = {
    stat: false,
    normalize: true,
    followLinks: true,
    size: true,
    hash: true,
    depth: 5,
    exclude: /dir_to_exclude/,
    extensions: [ 'txt', 'jpg' ]
};

const tree = dree.scan('./folder', options);

有很多定制选项,结果可能是这样的:
{
  "name": "sample",
  "path": "D:/Github/dree/test/sample",
  "relativePath": ".",
  "type": "directory",
  "size": "1.81 MB",
  "children": [
    {
      "name": "backend",
      "path": "D:/Github/dree/test/sample/backend",
      "relativePath": "backend",
      "type": "directory",
      "size": "1.79 MB",
      "children": [
        {
          "name": "firebase.json",
          "path": "D:/Github/dree/test/sample/backend/firebase.json",
          "relativePath": "backend/firebase.json",
          "type": "file",
          "extension": "json",
          "size": "29 B"
        }, 
        {
          "name": "server",
          "path": "D:/Github/dree/test/sample/backend/server",
          "relativePath": "backend/server",
          "type": "directory",
          "size": "1.79 MB",
          "children": [
            {
              "name": "server.js",
              "path": "D:/Github/dree/test/sample/backend/server/server.js",
              "relativePath": "backend/server/server.js",
              "type": "file",
              "extension": "js",
              "size": "1.81 MB"
            }
          ]
        }
      ]
    }
  ]
}

即使是一个字符串也可以返回,就像这样:
sample
 └─> backend
     ├── firebase.json
     ├── hello.txt
     └─> server
         └── server.js

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接