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

问题描述 投票:2回答:2

我正在创建一个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方法,这只是搞砸了更多。我不知道我还能做些什么来摆脱这些'\'字符,我明白为什么他们在那里,但我不知道如何阻止它。任何帮助表示赞赏。

java json amazon-web-services lambda serverless
2个回答
3
投票

好的,所以我明白了。原来无服务器不仅包括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(通过构建器)时,对象只是传递给.setObjectBody方法('result'),无服务器自动为我们转换为JSON。而已!代码中不需要解析为JSON。


-1
投票

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

Gson gson = new Gson();
gson.toJson(person);
© www.soinside.com 2019 - 2024. All rights reserved.