首页 > 解决方案 > 嵌套对象的 Java Jackson 反序列化

问题描述

使用 AWS Lambda,当一个因异常而失败时,AWS 将该异常序列化为 JSON,并将其发送回调用该 Lambda 的任何对象。这可能是这样的:

{  
     "errorMessage":"USER_SERVICE_FAILURE",
     "errorType":"com.company.project.lambda.core.exceptions.LambdaFailureException",
     "stackTrace":[  
        "com.company.project.lambda.worker.MainWorkerLambda.handleRequest(AccountWorker.java:127)",
        "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
        "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
        "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
        "java.lang.reflect.Method.invoke(Method.java:498)"
     ],
     "cause":{
        "errorMessage":"some other exception error message",
        "errorType":"com.company.project.lambda.core.exceptions.SomeOtherException",
        "stackTrace":[  
           "insert other stack trace strings here...",
           "...",
           "..."
        ],
        "cause":{
           "errorMessage": "...",
           ...continue in to perpetuity...
        }
     }
}

errorMessage和字段很容易反序列化——它们将分别一个errorType、一个和一个。 stackTraceStringStringList<String>

我被困的地方是cause田野。如果没有原因,这可能是一个空对象,或者一个嵌套异常,或者两个,或者一百个......

我如何反序列化这个?到目前为止,这是我的 POJO。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExceptionRep {
    String errorMessage;

    String errorType;

    List<String> stackTrace;

    // how do I do the cause field?
}

标签: javajsonjacksonaws-lambda

解决方案


如果您不想在自定义类中定义所有属性,则可以使用 HashMap。


推荐阅读