0

Model.java にデシリアライズしてから、その Java オブジェクトを ModelView.java にコピーします。日付を文字列からミリ秒に変換して、発信 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);
    }
}

モデル.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 で変数名を「date」から別の名前に変更することはできますが、発信する json は同じままにする必要があります。

4

1 に答える 1

1

Jackson には日付形式が組み込まれています。たとえば、オブジェクト マッパーで DateFormatter を設定できますが、これはシリアル化と逆シリアル化の形式が同じ場合にのみ機能すると思います。

シリアライゼーションとデシリアライゼーションを異なる形式にしたい場合、日付のシリアライゼーションとデシリアライゼーションへのより簡単なアプローチは、Model.class で @JsonSerialize と @JsonDeserialize アノテーションを直接使用することです (これにより、変換のみが目的である場合、ModelView の必要性が時代遅れになる可能性があります)。日付)。

シリアライゼーションとデシリアライゼーション用に 2 つのクラスを作成できます。

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
}
于 2016-11-11T14:58:44.807 に答える