我正在尝试使用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);