JSON.parseObject()不能轉換父類屬性

先介紹一下業務場景,如今有一個業務對象基類:

public class JsonRequest{
    private String msg;
    private String code;
}

如今有N多子類對其進行繼承,而且自帶一個業務對象

public class DetailJsonRequest extends JsonRequest{
    private T body;
}

想這樣的一個對象,可能被用於序列號傳輸對象,在微服務中可能被用到

那麼如今,我做爲業務受理方,須要接受消費方發送來的請求,通常經過驗籤解密以後,會獲取到一個字符串,咱們這裏假設序列化方式爲Json

那麼解析之後,我獲取到這麼一個字符串:

String content = "{\"body\":{\"id\":\"1123\",\"name\":\"macky\"},\"code\":\"1\",\"msg\":\"成功\"}";

接下來,根據我須要的業務類型,進行轉換:

  • 方式1:
DetailJsonRequest jsonObject = JSON.parseObject(content, DetailJsonRequest.class);
  • 方式2:
DetailJsonRequest jsonObject = JSON.parseObject(content, new TypeReference<DetailJsonRequest<JsonContent>>(JsonContent.class) {});

接下來,讓咱們看看效果:

  • 方式1結果:
DetailJsonRequest(body={"name":"macky","id":"1123"})
  • 方式2結果:
DetailJsonRequest(body=JsonContent(id=1123, name=macky))

發現了啥貓膩了嗎,這裏丟失了msg和code信息,大驚失色!!

通過各類查找,經過文檔、github issue等等等,發現了罪魁禍首——toString方法

我在日常工做中,會使用到lombok插件,而後會數據打上@data註解,輕鬆完成一個bean構造

因此上述的JsonRequest和DetailJsonRequest都掛着@data註解

如今,給DetailJsonRequest加上另外一個註解:@ToString(callSuper=true)

或者是若是你沒有使用lombok,那麼使用這樣一個toString方法:

@Override
    public String toString() {
        return "DetailJsonRequest{" +
                "body=" + body +
                ", msg='" + super.getMsg() + '\'' +
                ", code='" + super.getCode() + '\'' +
                '}';
    }

從新驗證,會發現倆個方式的解析均可以獲得msg和code信息:

DetailJsonRequest(super=JsonRequest(msg=成功, code=1), body={"name":"macky","id":"1123"})
DetailJsonRequest(super=JsonRequest(msg=成功, code=1), body=JsonContent(id=1123, name=macky))

問題解決了,那麼如今回過頭來看看,爲什麼這樣作是能夠的,知其然,知其因此然

……未完待續

如如有錯,煩請指出

相關文章
相關標籤/搜索