【问题标题】:Returning JSON encode string from node.js从 node.js 返回 JSON 编码字符串
【发布时间】:2015-04-22 18:51:52
【问题描述】:

我是 node.js 的一个完整的菜鸟,并试图通过使用 learnyounode 来学习它。我陷入了learnyounode的最后一个问题 - [HTTP JSON API 服务器]。
在这里,教程将调用一个 url 来提供时间(作为 iso 标准),node.js 服务器应该在 (k,v) 中返回 json 回复,其中对将是 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']有什么?
  • 你能创建一个小提琴吗?
  • 尝试使用 result={} 而不是 =[]
  • @Tresdin 它包含以下格式的 iso 格式日期 - YYYY:mm:DDTHH:MM:SS.MS
  • @CFrei 显然这可以解决问题:)。 ty

标签: javascript json node.js


【解决方案1】:
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;
}

您将result 初始化为一个数组,但将其视为一个对象。 JavaScript 可以接受这一点,但 JSON 不接受——数组就是数组,对象就是对象。

如果您将其初始化为对象 (var result = {};),JSON 将识别其属性并打印它们。事实上,JSON 只看到一个空数组。

【讨论】:

  • 其实我知道错了,我认为 JSON 适用于地图数组 (k,v),但根据您的评论,它似乎适用于对象 (propery-name, value)
【解决方案2】:

我改变了一些地方。

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))};
}

+string 转换为 int

【讨论】:

    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多