4

我正在创建一个 API(用 Java 编写),我通过无服务器将其部署到 AWS Lambda 函数的端口。API 功能的所有方面都很棒,除了返回的请求在所有引号前都包含“\”字符。

从这个角度来看,我有一个 person 类,其中包含 name (String) 和 mood (String) 的实例变量。然后我的类使用这个类来获取和创建一个 Person 对象,然后使用 Jackson 将其解析为 JSON 格式。这是返回到处理函数(对于 lambda)并显示为“对象主体”的内容。

public class Person{
    String name;
    String mood;
    //getters and setters and constructor
}

然后,稍后会有其他类的东西,比如

Person person = new Person("bob", "good");

这将被传递到我的方法中,该方法应该将事物转换为 JSON:

private String convStrToJson(Person person) throws JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(person);
    return json;

}

如果我要在输出中打印它,我会得到类似的东西:

{"name":"bob","mood":"good"}

这是我想要和期待的。但是,当通过 GET 请求部署和调用时,结果是:

"{\"name\":\"bob\",\"mood\":\"good\"}"

我尝试了几种策略,包括对解析方法的添加,例如:

json = json.replace("\"", "");

从两个输出中完全删除引号,或者:

json = json.replace("\\","");

这根本没有效果。我还尝试了这两种方法作为 replaceAll 方法,这只会让事情变得更糟。我不确定我还能做些什么来摆脱这些“\”字符,我理解它们为什么在那里,但我不知道如何阻止它。任何帮助表示赞赏。

4

3 回答 3

5

好的,所以我想通了。事实证明,无服务器不仅包括Jackson,而且实际上在它为处理响应而创建的布局中,“setObjectBody”部分将接受任何类型的对象并使用 Jackson将其解析为 JSON。这就是我搞砸的地方。我假设它只接受字符串,这是发生双重编码的地方。现在,如果我传入 Person 对象,serverless/Jackson 会为我适当地处理它并返回预期的输出。我将在下面包含代码片段以更好地演示此解决方案。无服务器创建一个“处理程序”类,该类具有一个模板,其中包括一个名为 handleRequest 的方法。填写后,这个类现在看起来像这样:

public class GetStatusHandler implements RequestHandler<Map<String, Object>, ApiGatewayResponse> {

private static final Logger LOG = Logger.getLogger(GetStatusHandler.class);

@SuppressWarnings("unchecked")
public ApiGatewayResponse handleRequest(Map<String, Object> input, Context context) {

    BasicConfigurator.configure();

    LOG.info("received: " + input);

      try {

         Map<String, String> pathParameters = (Map<String, String>) input.get("queryStringParameters");

         if(pathParameters == null) {

             LOG.info("Getting details for all persons ");
              PersonControl control = new PersonControl();
              Person[] result = control.myGetHandler(context); 
              return ApiGatewayResponse.builder()
                        .setStatusCode(200)
                        .setObjectBody(result)
                        .setHeaders(Collections.singletonMap("X-Powered-By", "AWS Lambda & serverless"))
                        .build();

         }else {

             String name = pathParameters.get("name"); 
             LOG.info("Getting details for "+name);
             PersonControl control = new PersonControl();
             Person result = control.myGetHandler(name, context);
             return ApiGatewayResponse.builder()
                        .setStatusCode(200)
                        .setObjectBody(result)
                        .setHeaders(Collections.singletonMap("X-Powered-By", "AWS Lambda & serverless"))
                        .build();

         }


        }catch(Exception e) {

            LOG.error(e, e);
            Response responseBody = new Response("Failure getting person", null);

            return ApiGatewayResponse.builder()
                  .setStatusCode(500)
                  .setObjectBody(responseBody)
                  .setHeaders(Collections.singletonMap("X-Powered-By", "AWS Lambda & serverless"))
                  .build();
        }
    }
}

并不是说当返回 ApiGatewayResponse(通过 builder)时,一个对象被简单地传递给 .setObjectBody 方法('result'),无服务器会自动为我们转换为 JSON。就是这样!代码中不需要解析为 JSON。

于 2017-12-18T04:18:53.053 回答
0

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

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

示例代码可以在这里找到。

于 2021-03-14T23:22:49.670 回答
-1

只需使用可用于将 Java 对象转换为其 JSON 表示的Google Gson Java 库。

Gson gson = new Gson();
gson.toJson(person);
于 2017-12-13T04:04:20.713 回答