java—无法摆脱'\';Lambda/Serverless部署后JSON中的字符

java—无法摆脱'\';Lambda/Serverless部署后JSON中的字符,java,json,amazon-web-services,lambda,serverless,Java,Json,Amazon Web Services,Lambda,Serverless,我正在创建一个API(用Java编写),通过serverless将其部署到AWS Lambda函数的端口。API函数的所有方面都很棒,除了返回的请求在所有引号前都包含“\”字符 为了将其放到透视图中,我有一个person类,它包含name(String)和mood(String)的实例变量。然后我有一个类,它使用这个类获取并创建一个Person对象,然后使用Jackson将其解析为JSON格式。这是返回给处理程序函数(对于lambda)并显示为“对象体”的内容 然后,稍后在另一个类中会有类似的内

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

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

然后,稍后在另一个类中会有类似的内容

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("\\","");
这根本没有效果。我还尝试了这两种方法,结果把事情搞得更糟。我不知道我还能做些什么来摆脱这些“\”字符,我理解它们为什么会出现,但我不知道如何阻止它们。非常感谢您的帮助。

只需使用java库即可将java对象转换为JSON表示形式

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

好吧,我想起来了。事实证明,serverless不仅包括Jackson,而且实际上在它为处理响应而创建的布局中,“setObjectBody”部分将接受任何类型的对象,并使用Jackson将其解析为JSON。这就是我搞砸的地方。我假设它只接受字符串,这就是双重编码发生的地方。现在,如果我传入Person对象,serverless/Jackson会为我适当地处理它,并返回预期的输出。为了更好地演示此解决方案,我将在下面包含代码片段。Serverless创建一个“handler”类,该类有一个模板,其中包含一个名为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();
        }
    }
}
公共类GetStatusHandler实现RequestHandler{
私有静态最终记录器LOG=Logger.getLogger(GetStatusHandler.class);
@抑制警告(“未选中”)
公共ApiGatewayResponse HandlerRequest(映射输入、上下文){
BasicConfigurator.configure();
日志信息(“接收:+输入”);
试一试{
MapPathParameters=(Map)input.get(“queryStringParameters”);
if(路径参数==null){
日志信息(“获取所有人员的详细信息”);
PersonControl控件=新的PersonControl();
Person[]result=control.myGetHandler(上下文);
返回ApiGatewayResponse.builder()
.setStatusCode(200)
.setObjectBody(结果)
.setHeaders(Collections.singletonMap(“X-Powered-By”、“AWS Lambda&serverless”))
.build();
}否则{
String name=pathParameters.get(“name”);
LOG.info(“获取“+名称”的详细信息);
PersonControl控件=新的PersonControl();
Person result=control.myGetHandler(名称、上下文);
返回ApiGatewayResponse.builder()
.setStatusCode(200)
.setObjectBody(结果)
.setHeaders(Collections.singletonMap(“X-Powered-By”、“AWS Lambda&serverless”))
.build();
}
}捕获(例外e){
日志错误(e,e);
Response ResponseBy=新响应(“获取人员失败”,null);
返回ApiGatewayResponse.builder()
.setStatusCode(500)
.setObjectBody(响应主体)
.setHeaders(Collections.singletonMap(“X-Powered-By”、“AWS Lambda&serverless”))
.build();
}
}
}

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

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

class Handler implements RequestHandler<SQSEvent, CustomObject> {
    public CustomObject handleRequest(SQSEvent event, Context context) {
        return new CustomObject();
    }
}
类处理程序实现RequestHandler{
公共CustomObject HandlerRequest(SQSEvent事件、上下文){
返回新的CustomObject();
}
}

可以找到示例代码。

您是否正在执行来自客户端/javascript的get请求?如果是,您可以使用JSON.parse(JSON),我的意思是从技术上讲,GET请求是从客户端执行的,然而,它目前只是通过调用AWS生成的URL来调用,因此它背后没有我编写的Javascript配置:/在我看来,由于某种原因,当AWS输出数据时,它包括字符串的所有方面,包括任何转义字符,到目前为止,我仍然找不到解决方法:/@JayIbeYou正在尝试解决错误的问题。这是一个重新编码为JSON字符串的JSON对象。您需要确定双重编码的来源。我唯一可以确定的来源是AWS,代码本身没有双重编码问题(如果我将数据打印到控制台,它看起来很棒),因此我无法修复代码中的问题。不幸的是,我意识到了这一点。然而,当信息通过Lambda返回到API网关时,AWS要求已经将其解析为JSON,代码完美地做到了这一点。在部署过程中的某个地方,AWS必须将JSON对象解析为一个字符串,其中(以某种方式)包含“\”字符。问题是我不知道在哪里,或者我如何才能改变这个@Michael sqlbot“通过获取请求”如何?你是说Lambda返回wh
class Handler implements RequestHandler<SQSEvent, CustomObject> {
    public CustomObject handleRequest(SQSEvent event, Context context) {
        return new CustomObject();
    }
}