<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當java物件中含List<Object>時,如果Object一個抽象類或介面,這裡就會出現java多型的現象,比如List<Animal>, 如果Animal是個抽象類,並且有多個子類時,由於List中儲存的Animal沒有明確指向具體的子類或實現類,json反序列化java物件時就會丟擲提示:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException:Can not construct instance of Animal, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information
可以使用@JsonTypeInfo與@JsonSubTypes來解決此類問題,通過註解,可以在序列化時,儲存具體的型別資訊到json中,當json反序列到java物件時,就可以根據具體型別資訊建立正確的java物件。
@JsonTypeInfo
– indicates details of what type information to include in serialization 指出序列化包含的型別資訊細節@JsonSubTypes
– indicates sub-types of the annotated type 指出被註解型別的子類@JsonTypeName
– defines a logical type name to use for annotated class 定義被註解類使用的邏輯名稱@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = Dog.class, name = "dog"), @JsonSubTypes.Type(value = Cat.class, name = "cat") }) public class Animal { public String name; public Animal(String name) { } } @JsonTypeName("dog") // 這裡在子類中指定的type name必須和抽象類中註解@JsonSubTypes中name屬性指定的值保持一致 public class Dog extends Animal { public double barkVolume; public Dog(String name) { super(name); barkVolume = 0.5; } } @JsonTypeName("cat") public class Cat extends Animal { boolean likesCream; public int lives; public Cat(String name) { super(name); likesCream = true; lives = 10; } } @Test public void whenSerializingPolymorphic_thenCorrect() throws JsonProcessingException { Zoo.Dog dog = new Zoo.Dog("lacy"); Zoo zoo = new Zoo(dog); String result = new ObjectMapper() .writeValueAsString(zoo); assertThat(result, containsString("type")); assertThat(result, containsString("dog")); } 序列化zoo物件,結果如下: { "type":"dog", "name":"lacy", "barkVolume":0 } @Test public void whenDeserializingPolymorphic_thenCorrect() throws IOException { String json = "{"name":"lacy","type":"cat"}"; Animal animal = new ObjectMapper().readerFor(Animal.class).readValue(json); assertEquals("lacy", animal.name); assertEquals(Cat.class, animal.getClass()); }
@Data public class CouponTemplateDto { /** * 優惠券型別id */ private Long couponTypeId; /** * 優惠券模板id */ private Long couponTemplateId; /** * 使用者id */ private Long userId; /** * 優惠券描述 */ private String description; /** * 面值,滿200減30,則此值為30 */ private BigDecimal value; /** * 從次日起,多少天可用 */ private Integer delayDays; /** * 從當日起,多少天可用 */ private Integer nowDays; /** * 滿多少可以減,滿200減30,則此值為200 */ private BigDecimal fullAmount; /** * 券號 */ private String couponNo; /** * 有效起始日期 */ private Date startTime; /** * 失效日期 */ private Date endTime; /** * 建立時間 */ private Date createTime; /** * 使用日期 */ private Date useTime; /** * 券使用狀態:0-未使用 1-已使用 2-已過期 */ private Integer couponUseStatus; /** * 過期前多少天提醒,預設7天 */ private Integer overDueRemind; /** * 優惠券標題 */ private String title; /** * 優惠券是否能開始使用 */ // @JsonProperty("isStart") private Boolean start; /** * 優惠券是否過期 */ // @JsonProperty("isEnd") private Boolean end; private Boolean getStart() { return startTime.before(new Date()); } private Boolean getEnd() { return endTime.before(new Date()); } }
我定義了一個這樣的類,我們專案用的是Spring Boot,預設底層採用的是jackson序列化,但是在使用中出了一個問題private Boolean start跟private Boolean end這兩個欄位一直無法序列化
1.是boolean還是Boolean,到底是基本資料型別還是包裝類,如果是基本資料型別的話(包裝類可以使用,但是不推薦),不要使用is開頭。我們可以看看阿里巴巴規範中的這段話
【強制】POJO類中的任何布林型別的變數,都不要加 is,否則部分框架解析會引起序列化錯誤。
反例:定義為基本資料型別 boolean isSuccess;的屬性,它的方法也是 isSuccess(),RPC框架在反向解析的時候,“以為”對應的屬性名稱是 success,導致屬性獲取不到,進而丟擲異常。
2.這個錯誤也是我犯的錯誤,我複寫了get方法,方法的存取許可權被設定成了private級別
解決方案:
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45