2016-11-11 29 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

太棒了!很高興聽到它的工作! –