杰克逊解组问题



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

我有一个问题。我尝试反序列化的字符串是:

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

字符串开头有对象类型"中"。这会导致杰克逊在反序列化期间失败:

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

我将"IGNORE_ON_UNKNOWN_PROPERTIES"设置为 false,然后在反序列化期间没有出现异常。但是,我的所有属性在 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 Medium
{ 
   string name;
   // specify other params also.
}
class BaseObject
{ 
  Medium Medium;
}

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

上面我给出了伪代码

你需要添加注释@JsonRootName("中等")在 Bean 类上,并将对象映射器配置为mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE).

您需要一种方法来删除作为输入 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);

最新更新