我目前正在实施将JSON解析为POJO。
我的Model类看起来像这样:
public class InvoiceModel {
@JsonDeserialize(using=MeteorDateDeserializer.class)
Date date;
String userId;
String customerName;
ArrayList<PaymentModel> payments;
[...getters, setters...]
}
JSON字符串可能如下所示:
{
"date": {
"$date": 1453812396858
},
"userId": "igxL4tNwR58xuuJbE",
"customerName": "S04",
"payments": [
{
"value": 653.5,
"paymentMethod": "Cash",
"userId": "igxL4tNwR58xuuJbE",
"date": {
"$date": 1453812399033
}
}
]
}
虽然可以省略付款字段。 Anywho,对于这个问题来说并不重要。你看,解析日期的格式有些“奇怪”,因为它封装在“date”对象的“$ date”属性中。然而,这不在我的掌控之中。
为了解决这个问题,我编写了一个自定义JSON反序列化器来用于此日期属性。它看起来像这样:
public class MeteorDateDeserializer extends org.codehaus.jackson.map.JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
// parse the "$date" field found by traversing the given tokens of jsonParser
while(!jsonParser.isClosed()){
JsonToken jsonToken = jsonParser.nextToken();
if(JsonToken.FIELD_NAME.equals(jsonToken)){
String fieldName = jsonParser.getCurrentName();
jsonToken = jsonParser.nextToken();
if("$date".equals(fieldName)){
long timeStamp = jsonParser.getLongValue();
return new java.util.Date(timeStamp);
}
}
}
return null;
}
}
具体问题如下:
返回的InvoiceModel POJO具有除“date”之外的所有属性设置为 null ,而日期被解析得很好。我已经将问题缩小到自定义日期反序列化器,没有反序列化日期(只是反序列化2个字符串值和付款数组,工作正常)。
我的论点是,该注释向杰克逊传达了自定义解串器将被用于用于整个班级,而不是仅仅用于用于日期字段。 根据{{3}},情况并非如此:
注释用于配置反序列化方面,通过附加到“setter”方法或字段,或
对序列化的调用并不特别。它只是一个标准的ObjectMapper调用。
InvoiceModel invoice = mapper.readValue(s2, InvoiceModel.class);
其中s2是JSON字符串。
我的杰克逊版本 1.9.7