Como obter JSON de volta do golang sem que ele seja codificado como uma string? estou usando este projeto para embrulhar o código em python para que eu possa executá-lo em uma função AWS lambda.
Minha questão é que, se eu retornar json.Marshal(obj)
ou string(json.Marshal(obj))
Ou recebo o json codificado em base64 ou uma representação de string (por ex. "{"bar": "foo"}"
). Essa não é uma resposta apropriada se você estiver usando o gateway de API da AWS, pois espera que o json puro seja o caso se você retornasse um objeto json no Node.js.
Aqui está o meu código:
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
}
Aqui está o resultado que recebo da AWS:
Respostas:
1 para resposta № 1https://play.golang.org/p/l2nrhG9lOA
Parece que a interface {} tipo de retorno é oculprint. Forçar isso a uma string retorna um valor mais parecido com JSON. Ter um tipo de retorno {} de retorno da interface me faz pensar que alguma outra coisa está esperando um valor de retorno estruturado ou empacotado. Perseguir a interface {} ou forçar uma seqüência e você deve ser bom.
0 para resposta № 2
json.Marshal
retorna uma string JSON pura. Parece que você está imprimindo com %q
. Vejo https://play.golang.org/p/skvAfk-frO.
0 para resposta № 3
Desde o AWS Lambda agora suporta oficialmente Go, aqui está um exemplo revisado.
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)
}