com.alibaba.fastjson.JSONException: write javaBean error

環境

對類對象進行序列化,轉換成json string做後續處理,在JSON.toJSONString的時候,報下面的異常導致APP奔潰了

# Bean對象的定義如下
public class AppBean implements Serializable{

    private Long id;
    private String name;
    private String pkgname;
    private Integer version;
    private String filepath;
    private Long filesize;
    private Drawable icon;
    . . .

分析

這個問題十有八九就是序列化的問題,對於所定義的這個Bean,有可能不能進行正常序列化的是Drawable,那麼猜測的解決辦法有:

  • 一個是將Drawable轉爲二進制存儲(轉Bitmap,再轉bytes);
  • 一個是忽略這個字段,因爲請求遠程的Bean,我是不需要傳這個字段的

日誌

2019-04-11 16:44:11.567 27693-27693/com.jeff.demo E/CrashReport: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jeff.demo/com.jeff.demo.activity.DemoActivity}: com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.1.70
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThreadH.handleMessage(ActivityThread.java:1593)atandroid.os.Handler.dispatchMessage(Handler.java:105)atandroid.os.Looper.loop(Looper.java:164)atandroid.app.ActivityThread.main(ActivityThread.java:6541)atjava.lang.reflect.Method.invoke(NativeMethod)atcom.android.internal.os.ZygoteH.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteMethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.1.70
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:693)
at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:262)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:760)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:404)
at com.jeff.demo.service.ServApp.checkForUpdate(ServApp.java:67)
at com.jeff.demo.presenter.PInstalledList.getCanUpdatedAppList(PInstalledList.java:23)
at com.jeff.demo.activity.DemoActivity.onCreate(DemoActivity.java:67)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)

解決辦法

我選擇第二種方式,在JSON序列化的時候忽略這個字段,查資料得知,可以這樣做,定義Drawable的時候增加註解@JSONField(serialize=false),顯式的告訴fastjson我不需要序列化這個變量,重新編譯後,App正常運行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章