如何编写正确的JSON文件?

时间:2017-04-20 02:50:11

标签: javascript json node.js

我有这段代码:

#!/usr/bin/env node
'use strict';
const request = require('superagent');
const querystring = require('querystring');
const path = require('path');
const fs = require('fs');

const timestamp = Math.floor(Date.now() / 1000).toString();

const logdir = path.join(__dirname, '../web/public/data/')
const logfile = path.join(logdir, timestamp + '.json');

// newsapi.org api key
const NEWSAPI_KEY = process.env.NEWSAPI_KEY; 

// sources endpoint
const SOURCES =  'https://newsapi.org/v1/sources?language=en';

// articles endpoint
const ARTICLE_ENDPOINT = 'https://newsapi.org/v1/articles?';

function getLatest(src){
    let sb = ['top','latest','popular'];
    for (let i in sb){
        let qs = querystring.stringify({source: src, sortBy: sb[i], apiKey: NEWSAPI_KEY});
        request
            .get(ARTICLE_ENDPOINT + qs)
            .end((err, res) => {
                if (!err){
                    fs.appendFile(logfile, JSON.stringify(res.body.articles), (err) => {
                    });
                }
            });
    }
}

request
    .get(SOURCES)
    .end((err, res) => {
        if (!err){
            for ( var i in res.body.sources){
                getLatest(res.body.sources[i].id);
            }
        }
});

此代码写入的文件最终看起来像这样

[{...},{...},{...}][{...},{...},{...}]...

这是无效的JSON。我如何确保它有效?

[{...},{...},{...},{...},{...},{...}]

我已经尝试了很多东西来使其工作,包括在事后将正则表达式应用于整个文件,将superagent包装在返回promise的函数中,并在依赖于代码中的事实之后编辑文件在这个脚本上运行。一切都无济于事。我知道必须有更好的(正确的)方法来做到这一点。

2 个答案:

答案 0 :(得分:0)

使用正则表达式查找模式"] ["并用","

替换它

答案 1 :(得分:0)

不是使用fs.appendFile附加到文件,而是在循环之前创建一个数组,然后附加到该数组,然后将其序列化。

function getLatest(src){
    let sb = ['top','latest','popular'];
    let reqs = sb.length;
    let allArticles = [];
    for (let i in sb){
        let qs = querystring.stringify({source: src, sortBy: sb[i], apiKey: NEWSAPI_KEY});
        request
            .get(ARTICLE_ENDPOINT + qs)
            .end((err, res) => {
                if (!err){
                    allArticles.push(res.body.articles);
                }
                else{
                  // error happend, decrement the number of requests needed for success.
                  reqs--;
                }
                // if the number of responses is as expected, write to the json all at once.
                if(allArticles.length == reqs)
                    fs.writeFile(logfile, JSON.stringify(allArticles), (err) => {});
            });
    }
}

问题在于,您正在序列化单个数据,然后附加到文件而不是加入数据,在一个大的序列中然后写入文件。