从文本文件递归构造JSON
从文本文件创建结构化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",
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)
})
太好了,谢谢!太好了,谢谢!