从mongodb集合导出有效的json

时间:2014-04-18 02:22:04

标签: json node.js mongodb

我正在尝试从使用node和instagram的api创建的mongodb集合中导出有效的json。我必须遗漏一些东西,因为它看起来应该非常简单。我已经阅读过其他帖子和mongo的文档,特别是关于mongoexport的文档。
我的最终目标是建立一个d3地图。我使用了文档中的基本mongoexport命令,它以下列格式返回了一个json文件:

{'name':'dan'}
{'name':'emma'}

有效的json将是:

[{'name':'dan'},
{'name':'emma'}]

我知道有这方面的解决方法,即使只是找到' $'在崇高的文本中,它将到达每一行的末尾,然后可以添加一个昏迷。在技​​术上知道这样做的正确方法会很棒。一篇文章建议使用JSON.parse,所以我尝试使用fs.readFile,但它返回错误:

undefined:2
{ "attribution" : null, "tags" : [], "location" : { "latitude" : 48.857141667,
^
SyntaxError: Unexpected token {. 

我只需要将整个mongo集合导出到一个有效的json文件中(将成功通过http://jsonlint.com/测试)。

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:12)

答案 1 :(得分:0)

正如评论中所提到的,直接解析mongodump的结果可能不是一个好主意。 Mongo不保证转储中的元素是有效的json(并且它们不是)。

但是如果你倾向于这样做,你可以使用event-stream来读取换行符分隔的对象流和一个解析器,它允许你的json有单引号而不是双引号(即hanson )。

然后您的代码可能如下所示:

var es = require('event-stream'),
    hanson = require('hanson'),
    in = process.stdin,
    out = process.stdout;


in //read the input stream
    .pipe(es.split()) //split it on newline
    .pipe(es.map(function(data, cb) {
        if (data === '') { //necessary due to the last element produced by split
            cb();
        } else {
            cb(null, hanson.parse(data)); //parse the line with hanson
        }
    }))
    .pipe(es.writeArray(function (err, array){ //convert resulting objects to array
        var strArray = JSON.stringify(array);
        out.write(strArray + '\n'); //write the resulting array to output stream
    }));

如果你有一个有效的json对象流(带双引号),相同的代码将缩短为:

var es = require('event-stream'),
    hanson = require('hanson'),
    in = process.stdin,
    out = process.stdout;


in
    .pipe(es.split()) 
    .pipe(es.parse())
    .pipe(es.writeArray(function (err, array){ 
        var strArray = JSON.stringify(array);
        out.write(strArray + '\n'); 
    }));

为了清晰起见,跳过了错误处理。