【问题标题】:Jackson JsonNode SerializationJackson JsonNode 序列化
【发布时间】:2025-11-25 05:20:12
【问题描述】:

我正在使用带有 Java 8 函数的 AWS Lambda。 Lambda 有一个内置的 Jackson Serializer,因此当您的方法返回一个对象时,它会将其序列化为 JSON 表示形式。

我有一个由以下属性组成的对象:

private String name;
private JsonNode model;
private JsonNode field;

为简单起见,我省略了该类的所有其余部分,但它具有 getter / setter 等。

通常,当我在本机应用程序中运行它时,它会完美运行。 JsonNode Tree 结构呈现为 JSON。例如:

{
    "name": "example",
    "model": {
        "key": "ipAddress",
        "type": "input",
        "templateOptions": {
            "label": "IP",
            "placeholder": "Something",
            "description": "The IP address.",
            "required": true
        }
    },
    "field": {
        "key": "pro",
        "type": "input",
        "templateOptions": {
            "label": "Pro",
            "placeholder": "Something",
            "description": "Pro Example",
            "required": false
        }
    }
}

但是,由于某些未知原因,当我在 Lambda 中运行它时,实际的 JsonNode 对象本身(不是树,而是包装器对象)被序列化。所以我得到了这个:

{
  "name": "example",
  "model": {
    "nodeType": "NULL",
    "array": false,
    "null": true,
    "valueNode": true,
    "containerNode": false,
    "missingNode": false,
    "object": false,
    "pojo": false,
    "number": false,
    "integralNumber": false,
    "floatingPointNumber": false,
    "short": false,
    "int": false,
    "long": false,
    "float": false,
    "double": false,
    "bigDecimal": false,
    "bigInteger": false,
    "textual": false,
    "boolean": false,
    "binary": false
  },
  "fields": {
    "nodeType": "ARRAY",
    "array": true,
    "null": false,
    "valueNode": false,
    "containerNode": true,
    "missingNode": false,
    "object": false,
    "pojo": false,
    "number": false,
    "integralNumber": false,
    "floatingPointNumber": false,
    "short": false,
    "int": false,
    "long": false,
    "float": false,
    "double": false,
    "bigDecimal": false,
    "bigInteger": false,
    "textual": false,
    "boolean": false,
    "binary": false
  },
  "schedule": "0 0/1 * 1/1 * ? *"
}

是否有人对为什么会发生这种情况有任何见解以及对解决方案/变通办法的任何建议?

更新:

我专门使用 JsonNode,因为 modelfield 是动态的并且在运行时提供。所以我不会提前知道结构。

【问题讨论】:

    标签: java amazon-web-services lambda jackson jackson2


    【解决方案1】:

    假设“模型”和“字段”将始终是对象,而不是数组,您可以为它们使用 Map<String, Object>。对于子对象,只需添加其他地图作为值。

    private String name;
    private Map<String, Object> model;
    private Map<String, Object> field;
    

    【讨论】:

    • 我不能!我专门使用 JsonNode 因为对象是动态的。
    • 你应该在你的问题中提到这一点。
    • 问题是Object作为JSON字符串到达​​系统并且必须转换为java对象。因此,即使我将其定义为Object,它仍然是JsonNode
    • 我无法更改 model 和 'field. They both need to be JsonNode` 的 Type
    • 我面临着完全相同的问题,因为在我们的系统中,com.fasterxml.jackson.databind.JsonNode 正在反序列化,而我们正在使用org.codehaus.jackson.JsonNode 进行序列化