我有一个请求执行器类,它将请求发送到 Web 服务,然后读取响应并使用 ObjectMapper.readValue() 从响应创建一个 java 对象;
我的问题是,Web 服务以混合大小写形式返回响应,而不是以正确的驼峰命名法返回响应中类的响应,例如以下响应:
{
"serviceResponse": {
"header": {
"success": "false",
"dateTime": "2012-03-12 09:06:45.60 UTC",
"errorCodes": [
{
"code": "123",
"message": "error occured while trying to get response - User not Logged in",
"causeString": "css_idks"
}
]
},
"body": {
"cls": "lst",
"empty": {}
}
}
}
我的类结构如下: ServiceResponse.Java:
public class ServiceResponse implements Serializable {
public ResponseHeader header;
public ResponseBody body;
}
我还有类似的 ResponseHeader.java 和 ResponseBody.java 类。 问题是,虽然 header 字段由于参数名称确实是“header”而正确解码到 ResponseHeader 对象,但 ServiceResponse 会失败,因为类名以大写 S 而不是小写 s 开头。
尝试解析响应时出现以下异常:
03-12 11:14:14.078: E/ELAD(3473): org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "serviceResponse" (Class com.elad.ServiceResponse), not marked as ignorable
如果我添加 ignorable=true 注释,它只会解析它,但里面的所有内容都是 null...
我需要知道如何注释该类,以便我可以定义一个它应该映射到的字段名称,该名称与类的名称不同,就像我可以使用@JsonProperty 注释。
请注意,我无法更改请求执行程序,因此我无法放入不同的反序列化器或类似的东西。
最佳答案
好吧,我只是犯了一个愚蠢的错误,但希望这对其他人有帮助,我将在回答中留下问题: 我不应该使用 ServiceResponse 作为传递给 objectMapper.readValue() 的类,而应该使用包含它的 DTO。 我对所有其他数据类型都这样做了,但由于某种原因忘记在这里这样做。
我的错...:)
关于java - Jackson Parser - 如何让对象映射器知道类的名称与响应中字段的名称的大小写不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9664702/