0

다음 Incoming json이 있습니다.이 json은 Model.java로 직렬화 해제 한 다음 해당 Java 객체를 ModelView.java에 복사합니다. String에서 milliseconds로 날짜를 변환하고 나가는 json을 응답으로 보내지 않을 것입니다. 어떻게해야합니까?jackson에서 serialize 및 deserialize하는 동안 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

Jackson은 날짜 포맷으로 일부 빌드를 가지고 있습니다. 예를 들어 객체 매퍼에서 DateFormatter를 설정할 수는 있지만 직렬화 및 직렬화 해제 형식이 동일한 경우에만 작동합니다.

직렬화 및 역 직렬화를 다른 형식으로 사용하려는 경우 Model.class에서 @JsonSerialize 및 @JsonDeserialize 주석을 직접 사용하는 것이 좋습니다 (이 경우 ModelView의 필요성이 더 이상 사용되지 않을 수 있습니다. 목적은 날짜를 변환하는 것이 었습니다). 보내는 JSON으로 직렬화에 대한

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); 
     } 
    } 
} 

다음 :

당신은 직렬화 및 역 직렬화에 대한 두 개의 클래스를 생성 할 수 있습니다

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

안녕하세요 @ 앤드류 맞춤 serializer를 구현하는 데 귀하의 조언을 들었지만 조금씩 다르게 처리했습니다. ModelView.java의 데이터 유형을'Long'에서'String'으로 변경하고 해당 필드에 시리얼 라이저 만 구현했습니다. 그리고'jsonGenerator.writeString'을하는 대신에 serializer에서'jsonGenerator.number'를 사용했습니다. – advaita

+0

좋아요! 그것을 듣고 기쁘다 일했다! –