@JsonComponentを使い、Json化しています。
java
1import com.fasterxml.jackson.core.JsonGenerator; 2import com.fasterxml.jackson.core.JsonParser; 3import com.fasterxml.jackson.databind.DeserializationContext; 4import com.fasterxml.jackson.databind.JsonDeserializer; 5import com.fasterxml.jackson.databind.JsonSerializer; 6import com.fasterxml.jackson.databind.SerializerProvider; 7import net.proto.qps.util.DtUtils; 8import org.springframework.boot.jackson.JsonComponent; 9 10import java.io.IOException; 11import java.time.LocalDateTime; 12import java.time.format.DateTimeFormatter; 13 14@JsonComponent 15public class LocalDateTimeJson { 16 17 public static class LocalDateTimeSerializer 18 extends JsonSerializer<LocalDateTime> { 19 @Override 20 public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 21 if (value == null) { 22 return; 23 } 24 gen.writeString(value.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS"))); 25 26 } 27 } 28 29 public static class LocalDateTimeDeserializer 30 extends JsonDeserializer<LocalDateTime> { 31 @Override 32 public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { 33 if (p.getText() == null) { 34 return null; 35 } 36 return DtUtils.toLocalDateTime(p.getText()); 37 } 38 } 39}
以下のクラスのmessageTime2は違う形式にしたいですが、どうもLocalDateTimeSerializer.serializeでは
常にyyyy/MM/dd HH:mm:ss.SSS形式にしているため、個別のフォーマットを指定できません。
※そもそも@JsonFormatが効かないかも
java
1import com.fasterxml.jackson.annotation.JsonFormat; 2import lombok.Data; 3 4import java.time.LocalDateTime; 5 6@Data 7public class PushChatDataDto { 8 9 private String pushType; 10 private Long roomId; 11 private Long sendUserId; 12 private String sendUserPeerId; 13 private String sendUserName; 14 private Long messageId; 15 @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss.SSS") 16 private LocalDateTime messageTime; 17 18 @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss") 19 private LocalDateTime messageTime2; 20 private String message; 21 22 23} 24
java
1import com.fasterxml.jackson.databind.ObjectMapper; 2import junit.framework.TestCase; 3import net.proto.qps.util.dto.PushChatDataDto; 4import org.junit.Test; 5import org.junit.runner.RunWith; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.boot.test.context.SpringBootTest; 8import org.springframework.test.context.junit4.SpringRunner; 9 10import java.time.LocalDateTime; 11 12@RunWith(SpringRunner.class) 13@SpringBootTest 14public class ChatDataTest extends TestCase { 15 @Autowired 16 private ObjectMapper jacksonObjectMapper; 17 18 // JsonFormat効かない 19 @Test 20 public void test() throws Exception { 21 22 PushChatDataDto dto = new PushChatDataDto(); 23 dto.setPushType("test"); 24 dto.setRoomId(1L); 25 dto.setSendUserId(1L); 26 dto.setMessageTime(LocalDateTime.now()); 27 dto.setMessageTime2(LocalDateTime.now()); 28 String s = jacksonObjectMapper.writeValueAsString(dto); 29 System.out.println(s); 30 } 31}
上記のテストクラスを実行したら、MessageTime、MessageTime2の値の形式は同じです。
個別に指定したいですが、方法ありますか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/06 03:21