2016-11-11 50 views
0

我有以下传入json,我将其反序列化为Model.java,然后将该java对象复制到ModelView.java。我不想将日期从String转换为毫秒,并将发送的json作为响应发送。 我该如何去做?如何在jackson中序列化和反序列化时更改JSON节点的数据格式

我有具体的理由,使用对象映射器将Model.java中的值复制到ModelView.java。所以请不要建议修改该部分。我正在通过注释来做到这一点。我很确定它可以完成,但不知道如何。

这里提供的json是一个简单的。我在实际场景中有一个很大的json。

传入的JSON

{ 
"date":"2016-03-31" 
} 

传出的Json

{ 
"date":236484625196 
} 

我的控制器类

@Controller 
public class SomeController extends BaseController { 

    @Autowired 
    private SomeService someService; 


    @RequestMapping(method = RequestMethod.GET, produces = "application/json") 
    public @ResponseBody 
    ResponseEntity<RestResponse> getDetails(HttpServletRequest request, HttpServletResponse response) { 

     Model model = someService.getData(); 

     ModelView modelView = ModelView.valueOf(model); 

     return getSuccessResponse(modelView); 
    } 
} 

Model.java

@JsonInclude(Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Model implements Serializable { 

    private String date; 

    //normal getters and setters 
} 

ModelView.java

@JsonInclude(Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class ModelView implements Serializable { 

    private Long date; 
    //normal getters and setters 


    public static ModelView valueOf(Model model){ 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); 

     ObjectMapper mapper = new ObjectMapper(); 
     ModelView modelView = mapper.convertValue(model, ModelView.class); 
     try { 

      modelView.setDate(sdf.parse(model.getDate()).getTime()); 
     } catch (ParseException e) { 
      IntLogger.error("logging error here"); 
     } 
     return modelView; 
    } 
} 

我愿意从“日期”改变变量名称到别的东西ModelView.java但传出JSON应保持不变。

回答

1

杰克逊有一些内置日期格式,例如,您可以在对象映射器上设置DateFormatter,但我相信这只适用于序列化和反序列化格式相同的情况。

如果您希望序列化和反序列化是不同的格式,一种更简单的日期序列化和反序列化方法是直接在您的Model.class上使用@JsonSerialize和@JsonDeserialize注释(如果您只需要ModelView,则可以过时目的是转换日期)。

您可以创建两个类序列化和反序列化:

public class JsonDateDeserializer extends JsonDeserializer<Date> { 

    @Override 
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
     final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
     String dateString = jsonParser.getText(); 
     try { 
      return dateFormat.parse(dateString); 
     } 
     catch (ParseException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

那么对于序列化到您的发送JSON:

public class JsonDateSerializer extends JsonSerializer<Date> { 

    @Override 
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { 
     jsonGenerator.writeString(Long.toString(date.getTime())); 

    } 
} 

现在,你的只是注解你Model.java:

@JsonInclude(Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Model implements Serializable { 

    @JsonSerialize(using = JsonDateSerializer.class) 
    @JsonDeserialize(using = JsonDateDeserializer.class) 
    private String date; 

    //normal getters and setters 
} 
+0

嗨@Andrew我接受你的建议来实现自定义序列化器,但做了一点不同。我将ModelView.java的数据类型从“Long”更改为“String”,并在该字段上仅实现了一个序列化程序。而在串行器中,而不是'jsonGenerator.writeString',我使用了'jsonGenerator.number',它工作。 – advaita

+0

太棒了!很高兴听到它的工作! –