从node.js返回JSON编码字符串

4
我是一名完全不懂node.js的新手,正在通过使用learnyounode学习它。我卡在了learnyounode的最后一个问题上 - [HTTP JSON API SERVER]。
在这里,教程将调用一个url来提供时间(作为iso标准),而node.js服务器应该返回(k,v)中的json回复,其中pair将是k = {“hour”,“minute”,“second”}。
我的解决方案如下:
var http = require('http');
var url = require('url');

function get_json(str) {
        var result = [];
        str = str.substr(str.lastIndexOf('T') + 1);
        result['hour'] = Number(str.substring(0, str.indexOf(':')));
        str = str.substring(str.indexOf(':') + 1);
        result['minute'] = Number(str.substring(0, str.indexOf(':')));
        str = str.substring(str.indexOf(':') + 1);
        result['second'] = Number(str.substring(0, str.indexOf('.')));
        return result;
}

function get_unix(str) {
        var result = get_json(str);
        result['unix'] =  ((result['hour'] * 3600000) +
                (result['min'] * 60000) + (result['sec'] * 1000));
        return result;
}

var server = http.createServer(function (req, res) {
        if (req.method != 'GET') {
                return res.write('{ "error": "query-failed" }');
        }
        var cur_url = url.parse(req.url, true);
        if (cur_url['pathname'] == '/api/parsetime') {
                res.writeHead(200, { 'Content-Type': 'application/json' });
                res.write(JSON.stringify(get_json(cur_url['query']['iso'])));
        } else if (cur_url['pathname'] == '/api/unixtime') {
                res.writeHead(200, { 'Content-Type': 'application/json' });
                res.write(JSON.stringify(get_unix(cur_url['query']['iso'])));
        }
        console.log(get_json(cur_url['query']['iso']));
        console.log(JSON.stringify(get_json(cur_url['query']['iso'])));
        res.end();
});

server.listen(process.argv[2]);

但是这个解决方案并不起作用,因为JSON.stringify()返回了空的[]字符串。我在这里漏掉了什么吗?

当前解决方案的输出:

[ hour: 7, minute: 27, second: 38 ]
[]
[]
[]
[ hour: 7, minute: 27, second: 38 ]
[]

cur_url['query']['iso'] 里面有什么内容? - Lewis
请创建一个 Fiddle。 - marcel
2
尝试使用 result={} 而不是 =[]。 - CFrei
@Tresdin,它包含以下格式的ISO日期 - YYYY:mm:DDTHH:MM:SS.MS - fadedreamz
@CFrei 看来这个就解决了 :) 。谢谢。 - fadedreamz
2个回答

4
function get_json(str) {
        <b>var result = []</b>;
        str = str.substr(str.lastIndexOf('T') + 1);
        result['hour'] = Number(str.substring(0, str.indexOf(':')));
        str = str.substring(str.indexOf(':') + 1);
        result['minute'] = Number(str.substring(0, str.indexOf(':')));
        str = str.substring(str.indexOf(':') + 1);
        result['second'] = Number(str.substring(0, str.indexOf('.')));
        return result;
}

你正在将result初始化为一个数组,但是却将其当作对象来处理。尽管JavaScript可以接受这种情况,但JSON不行——数组就是数组,对象就是对象。
如果你将它初始化为一个对象(var result = {};),JSON就能够识别它的属性并打印出它们。否则,JSON只会看到一个空数组。

实际上我理解错了,我以为 JSON 可以使用映射数组 (k,v) ,但是根据你的评论,它似乎只能使用对象 (属性名,值)。 - fadedreamz

3

我已经更改了一些地方。

function get_json(str) {
    str = new Date(str).toLocaleTimeString();

    var arr = str.split(":");

    var result = {};
    result['hour'] = +arr[0];
    result['minute'] = +arr[1];
    result['second'] = +arr[2];

    return result;
}

function get_unix(str) {
    return {"unixtime": +(new Date(str))};
}

+字符串转换为整数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接