杰克逊JsonNode序列化

4
我将使用Java 8函数和AWS Lambda。Lambda内置了Jackson序列化程序,因此当您的方法返回对象时,它会将其序列化为JSON表示形式。
我有一个由以下属性组成的对象:
private String name;
private JsonNode model;
private JsonNode field;

为了简化,我省略了类的其余部分,但它具有getter / setter等。

通常情况下,在我的本地应用中运行时,它可以完美地工作。 JsonNode树结构将呈现为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,因为模型和字段是动态的,且在运行时提供。因此我不知道结构。

1个回答

0

假设“model”和“field”始终是对象,而不是数组,则可以为它们使用Map<String,Object>。对于子对象,只需将其他映射添加为值即可。

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

我不行!我特意使用JsonNode,因为对象是动态的。 - tarka
是的,但是Map内部的Object是一个JsonNode,最终会遇到相同的问题。唯一的区别是它现在被包装在一个Map中。 - tarka
我不确定你是否理解我的意思。在我的测试中,Map内的“Object”是另一个Map(具体来说是LinkedHashMap)。当你说它“是JsonNode”时,你是基于经验还是猜测? - rmlan
2
我无法更改modelfieldType。它们都需要是JsonNode - tarka
3
我遇到了完全相同的问题,因为我们系统中使用的是com.fasterxml.jackson.databind.JsonNode进行反序列化,但我们又用org.codehaus.jackson.JsonNode进行序列化。请问您能否帮我解决这个问题? - Evilguy
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接