Jackson Custom Deserializer打破默认值

时间:2016-02-20 15:51:13

标签: java json serialization jackson

我目前正在实施将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

0 个答案:

没有答案
相关问题