我正在创建一个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);