Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
Xml 如何使用nodejs将可读流转换为有效的JSON?_Xml_Json_Node.js_Stream_Feedparser - Fatal编程技术网

Xml 如何使用nodejs将可读流转换为有效的JSON?

Xml 如何使用nodejs将可读流转换为有效的JSON?,xml,json,node.js,stream,feedparser,Xml,Json,Node.js,Stream,Feedparser,我正在尝试使用concert数据的ATOM提要,并将其输出到JSON,以便更好地使用 到目前为止,我一直在使用它来获取数据并对其进行解析,它似乎按照我的意愿工作 //数据 变量饲料http://mix.chimpfeedr.com/630a0-dcshows'; var wstream=fs.createWriteStream('data.json'); var req=请求(提要); var feedparser=新的feedparser({ addmeta:false }); 请求开启(“响

我正在尝试使用concert数据的ATOM提要,并将其输出到JSON,以便更好地使用

到目前为止,我一直在使用它来获取数据并对其进行解析,它似乎按照我的意愿工作

//数据
变量饲料http://mix.chimpfeedr.com/630a0-dcshows';
var wstream=fs.createWriteStream('data.json');
var req=请求(提要);
var feedparser=新的feedparser({
addmeta:false
});
请求开启(“响应”,功能(res){
var stream=这个;
如果(res.statusCode!=200)返回此.emit('error',新错误('Bad status code'));
stream.pipe(feedparser)
});
feedparser.on('readable',function(){
var stream=这个;
var项目;
//…进行一些业务工作以获取“数据”对象
write(JSON.stringify(data)+',');
});
这将写入一个文件,该文件实际上是这些数据对象的串联列表:

{
    object1
}, {
    object2
}, {
    etc
},
这很酷,但我希望它被包装在一个数组中,并且我希望最后一项后面没有逗号。我肯定有一些方法可以解决这个问题,但我认为我缺少了流方法的核心概念和实际发生的事情


因此,我的问题是:如何操作可读流(XML)并输出有效JSON数组?

您的方法可能存在的问题是,在流中放入的每个JSON元素的末尾添加逗号。这种方法失败了,因为您无法确定是否会有更多的数据从读取流中流出

因此,更好的方法是在JSON元素的开头添加逗号,但前提是您之前至少处理过一个元素。对于这个问题,您可以使用一个标志或变量来计算您已处理的元素的数量,并根据该数量决定是否处理第一个元素

如果位于第一个元素,则添加
“[”
到流中,表示数组的开头,然后将第一个元素添加到写入流中。如果不处理第一个元素,则表示您位于第二个、第三个或n个元素上,在这种情况下,首先添加逗号,然后添加元素

最后,在读取流上为
'end'
事件添加一个侦听器,这样,当到达数据末尾时,您会收到通知,然后您可以添加写入流的结束括号
“]”
,并完成一个有效的json数组

我使用硬盘中的一些本地数据创建了这个示例的简化版本。我很肯定你能把它适应你的情况

var FeedParser = require('feedparser'),
    fs = require('fs'), 
    feed = __dirname+'/rss2sample.xml';

var ws = fs.createWriteStream('data.json');
var first = true;
fs.createReadStream(feed)
  .on('error', function (error) {
    console.error(error);
  })
  .pipe(new FeedParser())
  .on('error', function (error) {
    console.error(error);
  })
  .on('readable', function() {
    var stream = this, item;
    while (item = stream.read()) {
      if(first){
        ws.write('[');
        first = false;
      } else {
        ws.write(',');
      }
      ws.write(JSON.stringify(item));
    }
  })
  .on('end', function(){
    ws.write(']');
  });
这将生成一个有效的json文件