在 Go 中返回 JSON

fra*_*eco 3 lambda go amazon-web-services

如何在不将其编码为字符串的情况下从 golang 取回 JSON?我正在使用这个项目在 python 中包装 go 代码,以便我可以在 AWS lambda 函数中执行它。

我的问题是,我是返回 json.Marshal(obj)还是string(json.Marshal(obj))获取 base64 编码的 json 或字符串表示(例如"{\"bar\": \"foo\"}")。如果您使用 AWS API 网关,这不是一个合适的响应,因为它期望纯 json,就像您在 Node.js 中返回 json 对象一样。

这是我的代码:

package main

import "C"

import (
  "encoding/json"
  "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime"
)

type Response struct {
  StatusCode  int       `json:"statusCode"`
  Headers     map[string]string  `json:"headers"`
  Body        string    `json:"body"`
}

func Handle(evt json.RawMessage, ctx *runtime.Context) (interface{}, error) {
  res := &Response{
    StatusCode: 1,
    Headers: map[string]string{"Content-Type": "application/json"},
    Body: "Hello World",
  }
  content, _ := json.Marshal(res)
  return string(content), nil
}
Run Code Online (Sandbox Code Playgroud)

这是我从 AWS 得到的结果:

在此处输入图片说明

ope*_*onk 5

由于 AWS Lambda 现在正式支持 Go,这里是一个修改后的示例。

package main

import (
    "github.com/aws/aws-lambda-go/lambda"
)

// Response ...
type Response struct {
    StatusCode int               `json:"statusCode"`
    Headers    map[string]string `json:"headers"`
    Body       string            `json:"body"`
}

// Handle ...
func Handle() (Response, error) {
    return Response{
            StatusCode: 1,
            Headers:    map[string]string{"Content-Type": "application/json"},
            Body:       "Hello World",
        },
        nil
}

func main() {
    lambda.Start(Handle)
}
Run Code Online (Sandbox Code Playgroud)


(下面用另一个例子更新)

您也可以直接使用map[string]interface{}数据类型而无需创建type.

package main

import (
    "github.com/aws/aws-lambda-go/lambda"
)

// Handle ...
func Handle() (map[string]interface{}, error) {
    return map[string]interface{}{
            "statusCode": 1,
            "headers":    map[string]string{"Content-Type": "application/json"},
            "body":       "Hello World",
        },
        nil
}

func main() {
    lambda.Start(Handle)
}
Run Code Online (Sandbox Code Playgroud)