杰克逊解组问题

jackson unmarshalling problems

我正在尝试使用 Jackson 2 和 RestAssured(java IT 测试工具)反序列化 JSON 字符串。

我有问题。我要反序列化的字符串是:

{"Medium":{"uuid":"2","estimatedWaitTime":0,"status":"OPEN_AVAILABLE","name":"Chat","type":"CHAT"}}

String开头有对象类型"Medium"。这导致 Jackson 在反序列化期间失败:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Medium"

我已将 "IGNORE_ON_UNKNOWN_PROPERTIES" 设置为 false,然后我在反序列化期间没有出现异常。但是,我所有的属性都是 'null' in java.

Response getAvailability -> {"Medium":{"uuid":"2","estimatedWaitTime":0,"status":"OPEN_AVAILABLE","name":"Chat","type":"CHAT"}}
@@@ MEDIUM name -> null
@@@ MEDIUM uuid -> null
@@@ MEDIUM wait time -> null
@@@ MEDIUM wait time -> null
@@@ MEDIUM status -> null

有谁能帮助我吗? (注意:我无法更改输入的 JSON 字符串)。

{
    "Medium": {
        "uuid": "2",
        "estimatedWaitTime": 0,
        "status": "OPEN_AVAILABLE",
        "name": "Chat",
        "type": "CHAT"
    }
}

如您所见,uuid 和其他参数是 medium object 的一部分,因此 class 它可以在其中反序列化。

class Medium
{ 
   string name;
   // specify other params also.
}

class BaseObject
{ 
  Medium Medium;
}

然后使用jackson.deserialize('json', BaseObject.class)

上面我给出了伪代码

您需要一种方法来删除作为输入的一部分的对象名称 JSON。由于您无法更改输入字符串,因此使用此代码将此输入字符串更改为树并获取 "Medium" 节点的值。

ObjectMapper m = new ObjectMapper();
JsonNode root = m.readTree("{\"Medium\":{\"uuid\":\"2\",\"estimatedWaitTime\":0,\"status\":\"OPEN_AVAILABLE\",\"name\":\"Chat\",\"type\":\"CHAT\"}}");
JsonNode obj = root.get("Medium");
Medium medium = m.readValue(obj.asText, Medium.class);

您需要添加注释 @JsonRootName("Medium") 在您的 bean class 上并将对象映射器配置为 mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE).