一旦由 Lambda/Serverless 部署,就无法摆脱 JSON 中的"\"字符



我正在创建一个API(用Java编写),该API通过无服务器部署,该端口可以端口到AWS lambda函数。API的所有方面都非常出色,除了返回的请求包括所有引号前的" "字符。

为了将其视为透视,我有一个人类类,其中包含名称(字符串)和情绪(字符串)的实例变量。然后,我有我的课程使用此类来获取和创建一个人对象,然后杰克逊被用来将其解析为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("\","");

根本没有效果。我还尝试了这两种方法作为替代方法,这只是使事情更加混乱。我不确定我还能做些什么来摆脱这些" '角色,我知道它们为什么在那里,但我不知道该如何停止。感谢任何帮助。

好吧,我想出了。事实证明,无服务器不仅包括包括杰克逊,而且实际上是在为处理响应创建的布局中," setObjectbody"部分将接受任何类型的对象并使用jackson将其解析为JSON。这是我搞砸的地方。我认为它只会接受字符串,这是发生双重编码的地方。现在,如果我传递人对象,则无服务器/杰克逊(Server/Jackson)适当地处理它,并返回预期的输出。我将在下面包含代码片段,以更好地演示此解决方案。Serverless创建一个"处理程序"类,该类带有一个模板,其中包括一种称为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();
        }
    }
}

不是说,在返回ApiTeWayWayResponse(通过构建器)时,一个对象仅传递到.setObjectBody方法('result'),该方法无服务器会自动为我们转换为JSON。就是这样!代码中没有必要的JSON解析。

响应可以是

下方的用户定义对象
class Handler implements RequestHandler<SQSEvent, CustomObject> {
    public CustomObject handleRequest(SQSEvent event, Context context) {
        return new CustomObject();
    }
}

可以在此处找到示例代码。

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

Gson gson = new Gson();
gson.toJson(person);

相关内容

  • 没有找到相关文章

最新更新