解析从NODE.js返回的JSON

时间:2014-01-01 00:46:25

标签: json node.js

我正在使用jQuery对Node.js进行AJAX调用以获取一些JSON。 JSON实际上是在Node调用的Python child_process中“构建”的。我看到JSON正在被传递回浏览器,但我似乎无法解析它 - 尽管我可以从YQL查询中解析JSONP。

进行调用的网页与Node位于同一服务器上,所以我认为在这种情况下我不需要JSONP。

以下是代码:

index.html(摘录)

function getData() {
    $.ajax({
        url:       'http://127.0.0.1:3000',
        dataType:  'json',
        success:   function(data) {
            $("#results").html(data);
            alert(data.engineURL);  // alerts: undefined
        }
    }); 
}

server.js

function run(callBack) {
    var spawn = require('child_process').spawn,
    child = spawn('python',['test.py']);
    var resp = '';

    child.stdout.on('data', function(data) {
        resp = data.toString();
    });

    child.on('close', function() {
        callBack(resp);
    });
}

http.createServer(function(request, response) {
    run(function(data) {
        response.writeHead(200, {
            'Content-Type':
            'application/json',
            'Access-Control-Allow-Origin' : '*' });
        response.write(JSON.stringify(data));
        response.end();
    });
}).listen(PORT, HOST); 

test.py

import json
print json.dumps({'engineName' : 'Google', 'engineURL' : 'http://www.google.com'})

AJAX调用回来后,我执行以下操作:

$("#results").html(data);

并在网页上打印以下内容:

{“engineURL": "http://www.google.com", "engineName": "Google"}

但是,当我尝试按如下方式解析JSON时:

alert(data.engineURL);

我未定义。我几乎以为我实际上并没有传回JSON对象,但我不确定。

有人可以建议我在Python中构建JSON,从Node传回JSON,或者只是不在网页上正确解析JSON吗?

感谢。

1 个答案:

答案 0 :(得分:2)

  

我几乎以为我实际上并没有传回JSON对象,但我不确定。

是的,ajax响应是一个字符串。要获取对象,必须将该JSON字符串解析为对象。有两种方法可以做到这一点:

data = $.parseJSON(data);

或者,建议的方法是在$.ajax来电中指定dataType: 'json'。这样jQuery会在将响应传递给回调之前隐式调用响应$.parseJSON。另外,如果您使用的是$.get,则可以将其替换为$.getJSON


此外:

child.stdout.on('data', function(data) {
    resp = data.toString();
      // ^ should be +=
});

data事件的回调接收数据块,你应该将它与你已经收到的数据连接起来。您可能还没有遇到过这方面的问题,因为您的JSON很小并且大部分时间都在单个块中,但不依赖它,进行适当的连接以确保您的数据包含所有块而不仅仅是最后一个。