【问题标题】:Jackson deserialization max depth levelJackson 反序列化最大深度级别
【发布时间】:2018-11-16 17:46:04
【问题描述】:

使用 Spring Boot 应用程序,我发布了带有 10000 个嵌套 元素的 JSON,如下图所示,并获得了 java.lang.StackOverflowError

{
"__id": "1",
"__category":{
      "key1": {
        "key2": {
            "key3": {
                ...
                ...
                "key10000": "value"
                ...
                ...
            }
        }
      }
    }
}

有什么方法可以让这个错误更易于管理?

我的意思是,我不想避免这个错误,而是做一些类似自定义反序列化器的事情来设置一个允许嵌套的值,如果超过这个值就会抛出一些异常。

【问题讨论】:

    标签: java json spring serialization jackson


    【解决方案1】:

    您可以尝试使用 Jackson Streaming API 而不必一次反序列化整个内容。这是处理大型 JSON 对象或数组时推荐的方法。

    这允许您单独反序列化和处理组件,而不需要整个 JSON 对象存在于内存中。

    【讨论】:

    • 据我了解,我的问题的要点是大量的递归调用。我在com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject() 方法的递归调用期间捕获了java.lang.StackOverflowError。因此,如果我使用 Jackson Streaming API,我会发现同样的错误,因为我的 JSON 嵌套深度非常大。
    • @Andrew 使用流式 API,您应该能够使用迭代而不是递归,这将大大减少内存占用。如果输入相当复杂,您可能需要状态机。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2011-08-27
    相关资源
    最近更新 更多