Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从文本文件递归构造JSON_Json_Node.js_Parsing_Recursion - Fatal编程技术网

从文本文件递归构造JSON

从文本文件递归构造JSON,json,node.js,parsing,recursion,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",

从文本文件创建结构化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的属性如下,并且总是至少从一个空格字符开始

有时,bloc名称后面跟着一个字符串(如“BlocC foo”和“BlocC bar”),该字符串成为BlocC数组的子文档

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

有没有其他方法可以实现这一点(使用解析器或其他什么)

谢谢您的帮助。

您可以尝试以下方法:

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)

})
您可以尝试以下方法:

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)

})

太好了,谢谢!太好了,谢谢!