从文本文件中递归构造JSON

时间:2016-08-23 14:48:05

标签: json node.js parsing recursion

从文本文件创建结构化JSON时遇到一些困难。这是一个文本文件的例子

BlocA
   value 1 param X
   value 2 param Y
   value 3 param Z

BlocB
   this is a line
   this is another line

BlocC foo
   1
   2
   3
BlocC bar
   something else

我想要的JSON是这样的:

{
"BlocA" : [
    "value 1 param X",
    "value 2 param Y",
    "value 3 param Z"
    ]
},
"BlocB" : [
    "this is a line",
    "this is another line"
    ]
},
"BlocC" : [
   {"foo" : [1,2,3]},
   {"bar" : ["something else"]}
 ]
}

在我的文本文件中,bloc始终从一行的第一个字符开始,一个bloc的属性低于下,并且始终至少以空格字符开头。

有时,集团名称后跟一个字符串(如" BlocC foo"" BlocC bar"),它们成为BlocC数组的子文档。

我正在使用nodeJS来做到这一点。我虽然使用递归来做这件事,但对我来说这有点太棘手了。

还有另一种方法可以实现这个目标(使用解析器或其他方法)吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

const fs = require('fs')

let prop, subProp, json = {}

fs.readFile('data.txt', 'utf8', (err, data) => {

    data.split(/\r?\n/)
    .filter(line => line.search(/\S/) > -1)
    .reduce((obj, line) => {
        // array members
        if(line.search(/^\s+/) > -1) {

            subProp ? 
            obj[prop][obj[prop].length - 1][subProp].push(line.trim()) :
            obj[prop].push(line.trim())
        } else {
            // sub property
            if(line.search(/\s+/) > -1) {
                var props = line.split(/\s+/)
                prop = props[0].trim()
                subProp = props[1].trim()

                Array.isArray(obj[prop]) || (obj[prop] = [])
                obj[prop].push({
                    [subProp]: []
                })

            } else {
                prop = line.trim()
                subProp = null
                obj[prop] = []
            }
        }

        return obj
    }, {})

    console.log(json)

})