Java杰克逊嵌套对象的反序列化

时间:2018-05-14 15:35:48

标签: java json jackson aws-lambda

使用AWS Lambdas,当一个人因异常而失败时,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...
        }
     }
}

errorMessageerrorTypestackTrace字段很容易反序列化 - 它们始终是一个String,一个分别为StringList<String>

我遇到的是cause字段。如果没有原因,或者一个嵌套异常,或者两个,或者一百个...

,这可能是一个空对象

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

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

    String errorType;

    List<String> stackTrace;

    // how do I do the cause field?
}

3 个答案:

答案 0 :(得分:0)

我只是将您的ExceptionRep类重用为引用类型,并将该对象注释为可选(因此,如果JSON中没有原因,则它不会失败反序列化)。

类似的东西:

@JsonProperty(required=false)
ExceptionRep child;

这种方式如果存在嵌套原因,则会递归反序列化。 如果没有,则忽略该属性。

答案 1 :(得分:0)

将您的类定义为具有相同类型属性的节点结构:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExceptionRep {
    String errorMessage;
    String errorType;
    List<String> stackTrace;
    private ExceptionRep cause;
}

答案 2 :(得分:0)

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