我正在创建一个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方法,这只是搞砸了更多。我不知道我还能做些什么来摆脱这些'\'字符,我明白为什么他们在那里,但我不知道如何阻止它。任何帮助表示赞赏。
好的,所以我明白了。原来无服务器不仅包括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。
只需使用可用于将Java对象转换为其JSON表示的Google Gson java库。
Gson gson = new Gson();
gson.toJson(person);