【问题标题】:JSON returning with "\" (Lambda)JSON 返回“\” (Lambda)
【发布时间】:2016-07-07 09:50:37
【问题描述】:

我正在使用 AWS Lambda 从开放天气 api 获取 JSON 并返回它。

这是我的代码:

var http = require('http');

exports.handler = function(event, context) {
    var url = "http://api.openweathermap.org/data/2.5/weather?id=2172797&appid=b1b15e88fa797225412429c1c50c122a";
    http.get(url, function(res) {
        // Continuously update stream with data
        var body = '';
        res.on('data', function(d) {
            body += d;
        });
        res.on('end', function() {
            context.succeed(body);
        });
        res.on('error', function(e) {
            context.fail("Got error: " + e.message);
        });
    });
}

它可以工作并返回 JSON,但它会在每个 " 之前添加反斜杠,如下所示:

"{\"coord\":{\"lon\":145.77,\"lat\":-16.92},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"base\":\"cmc stations\",\"main\":{\"temp\":303.15,\"pressure\":1008,\"humidity\":74,\"temp_min\":303.15,\"temp_max\":303.15},\"wind\":{\"speed\":3.1,\"deg\":320},\"clouds\":{\"all\":75},\"dt\":1458518400,\"sys\":{\"type\":1,\"id\":8166,\"message\":0.0025,\"country\":\"AU\",\"sunrise\":1458505258,\"sunset\":1458548812},\"id\":2172797,\"name\":\"Cairns\",\"cod\":200}"

这是使用 (SwiftJSON) 将其检测为有效 JSON 来停止我的过度服务。

谁能告诉我如何使 API 信息以正确格式的 JSON 格式输出?

我试过.replace这样:

 res.on('end', function() {

        result = body.replace('\\', '');
        context.succeed(result);
    });

它没有改变任何东西。仍然有相同的输出。

【问题讨论】:

    标签: json amazon-web-services http-get aws-lambda openweathermap


    【解决方案1】:

    您将其作为字符串发布。

    试试 context.succeed(JSON.parse(result))

    来自文档

    提供的结果必须与 JSON.stringify 兼容。如果 AWS Lambda 未能进行字符串化或遇到另一个错误,则会引发未处理的异常,并将 X-Amz-Function-Error 响应标头设置为 Unhandled。

    http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

    所以本质上它把你的 json 字符串作为一个字符串并在它上面调用 JSON.stringify ......因此你看到的所有引号都被转义了。传递解析的JSON对象就成功了,应该不会有这个问题

    【讨论】:

    • 谢谢杰夫。非常感谢
    【解决方案2】:

    如果是 Java,只返回一个 JSONObject。看起来在返回字符串时它正在尝试进行一些转换并最终转义所有引号。

    【讨论】:

      【解决方案3】:

      如果使用 Java,响应可以是用户定义的对象,如下所示

      class Handler implements RequestHandler<SQSEvent, CustomObject> {
          public CustomObject handleRequest(SQSEvent event, Context context) {
              return new CustomObject();
          }
      }
      

      可以在here找到示例代码。

      【讨论】:

        【解决方案4】:

        对结果执行此操作:response.json()

        【讨论】:

        • 这似乎没有回答这个问题。请您更详细地解释这是如何解决这个问题的。
        【解决方案5】:

        你可以使用:

            res.on('end', function() {
         context.succeed(body.replace(/\\/g, '') );
        

        用空替换\..

        【讨论】:

        • 我在哪里使用这个?
        • 我更新了答案,如果它不起作用尝试 json.parse(body)
        • @JamesG 我又更新了代码,用这个 res.on('end', function() { context.succeed(body); 替换这个代码
        猜你喜欢
        • 2021-08-22
        • 2018-11-27
        • 2012-09-20
        • 2019-08-21
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多