GSON略知&GT异常; 4.0设备 [英] Gson throws an exception on > 4.0 devices

查看:262
本文介绍了GSON略知&GT异常; 4.0设备的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用GSON成功放置到JSON对象。它的工作原理是与Android 2.2(模拟器和真实设备),当我部署到Android 4.0及以上(模拟器和设备),我得到这个非常奇怪的例外设备魅力。

我已经证实,因为同样的code愉快地运行在老的设备没有与JSON字符串没有问题。

唯一的例外是绝对这里正在抛出:

GSON GSON =新GsonBuilder()setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
        返回gson.fromJson(jsonString,T);

在fromJson方法。

任何想法?

JSON字符串:(不得不删除HTTP://从JSON的网址)
    

 {SESSION_ID:a89d8cd07e356
    shoutout_items:[{attachment_url:xxxxxx.mobi/pic.php?id=478ba67a44d,
        attachment_url_full_size:xxxxxx.mobi/pic.php?id=01810a5e9f6e7065cd4,
        expires_at:1363264081,
        have_attachment:真实,
        MESSAGE_TEXT:你好,
        合作伙伴:{country_ code:ZA
            性别:男,
            昵称:尼克
            profile_pic_full_size_url:xxxxxx.mobi/pic.php?id=810a5e9f6e7065cd43629f1,
            profile_pic_url:xxxxxx.mobi/pic.php?id=23ca67a44d23,
            profile_summary:20,DBN
          },
        shoutout_id:31170,
        类型:大喊答题节目环节
      },
      {attachment_url:空,
        attachment_url_full_size:空,
        expires_at:1363264081,
        have_attachment:假的,
        MESSAGE_TEXT:你好,
        合作伙伴:{country_ code:ZA
            性别:男,
            昵称:标志,
            profile_pic_full_size_url:xxxxxx.mobi/pic.php?id=2db9e7f86b9bf7ca,
            profile_pic_url:xxxxxx.mobi/pic.php?id=b110191f1afac,
            profile_summary:40,DBN
          },
        shoutout_id:31322,
        类型:大喊答题节目环节
      }
    ]
}

堆栈跟踪:

  03-14 14:56:02.200:E / AndroidRuntime(19588):致命异常:主要
    03-14 14:56:02.200:E / AndroidRuntime(19588):了java.lang.RuntimeException:无法启动活动ComponentInfo {} mobi.smiggle.android/mobi.smiggle.android.MainFragmentActivity:java.lang.IllegalArgumentException异常:类android.text.BoringLayout声明了一个名为m_paint多个领域的JSON
    03-14 14:56:02.200:E / AndroidRuntime(19588):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在android.app.ActivityThread.access $ 600(ActivityThread.java:127)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1159)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在android.os.Handler.dispatchMessage(Handler.java:99)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在android.os.Looper.loop(Looper.java:137)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在android.app.ActivityThread.main(ActivityThread.java:4507)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在java.lang.reflect.Method.invokeNative(本机方法)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在java.lang.reflect.Method.invoke(Method.java:511)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在dalvik.system.NativeStart.main(本机方法)
    03-14 14:56:02.200:E / AndroidRuntime(19588):java.lang.IllegalArgumentException异常:致类android.text.BoringLayout声明了一个名为m_paint多个领域的JSON
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200:E / AndroidRuntime(19588):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:


解决方案

我发现,如果您的实例的 T 任何机器人视图组件(如扩展按钮,例如)或具有类的领域,从任何的 Android的扩展视图组件,你会得到这样的例外

由于某种原因,这个库不能序列查看的组件了。所以,你可以添加排除策略。例如,该战略将排除所有领域,除了与注释@SerializedName字段:

 类实现排除{ExclusionStrategy@覆盖
公共布尔shouldSkipClass(类&LT;&GT;为arg0){
    // TODO自动生成方法存根
    返回false;
}@覆盖
公共布尔shouldSkipField(FieldAttributes场){
    SerializedName SN = field.getAnnotation(SerializedName.class);
    如果(SN!= NULL)
        返回false;
    返回true;
}}

假设我们有样品JSON:

 私有最终字符串jsonSample ={\\样本\\:{\\字段1 \\:1,\\场2 \\:2}};

下面是样本code:

 私人无效parseJson(){
    排除EX =新排除();
    GSON GSON =新GsonBuilder()创建()。    GsonObject的GObject = gson.fromJson(jsonSample,GsonObject.class);}类GsonObject {
    @SerializedName(样本)
    公共SMPL SMPL;//专用按钮BTN; &LT; - 取消注释此行,你会得到你的错误!    类SMPL {
        @SerializedName(FIELD1)
        INT FL1;
        @SerializedName(字段2)
        INT FL2;
    }
}

但添加后的排除策略我上面写的:

 排除EX =新排除();
    GSON GSON =新GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();

所有的工作是正确的。

最后,我们有如下的测试程序:

 公共类MainActivity延伸活动{私人最终字符串jsonSample ={\\样本\\:{\\字段1 \\:1,\\场2 \\:2}};@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);    parseJson();
}私人无效parseJson(){
    排除EX =新排除();
// GSON GSON =新GsonBuilder()创建()。 &LT; - 无需EX战略,它会尝试serrialaze我们GsonObject按钮域,并抛出exeption
    GSON GSON =新GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();    GsonObject的GObject = gson.fromJson(jsonSample,GsonObject.class);    Toast.makeText(这一点,GSON+ gObject.smpl.fl1 ++ gObject.smpl.fl2,Toast.LENGTH_LONG).show();}类GsonObject {
    @SerializedName(样本)
    公共SMPL SMPL;    私人按钮BTN; //&LT; - 这个字段是我们对GSON系列化这个奇怪的异常原因    类SMPL {
        @SerializedName(FIELD1)
        INT FL1;
        @SerializedName(字段2)
        INT FL2;
    }
}
}排除类实现ExclusionStrategy {    @覆盖
    公共布尔shouldSkipClass(类&LT;&GT;为arg0){
        // TODO自动生成方法存根
        返回false;
    }    @覆盖
    公共布尔shouldSkipField(FieldAttributes场){
        SerializedName NS = field.getAnnotation(SerializedName.class);
        如果(NS!= NULL)
            返回false;
        返回true;
    }}

P.S。对不起,我的英语)

I'm using Gson successfully to place json into an object. It works like a charm on devices with android 2.2 (emulator and real device), when I deploy to android 4.0 and above (emulator and device) I get this very weird exception.

I've confirmed that there is no problem with json string because the same code runs happily on older devices.

The exception is definitely being thrown here:

Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); return gson.fromJson(jsonString, t);

in the fromJson method.

Any ideas?

Json String: (had to remove the http:// from the urls in the json)

{ "session_id" : "a89d8cd07e356",
    "shoutout_items" : [ { "attachment_url" : "xxxxxx.mobi/pic.php?id=478ba67a44d",
        "attachment_url_full_size" : "xxxxxx.mobi/pic.php?id=01810a5e9f6e7065cd4",
        "expires_at" : 1363264081,
        "have_attachment" : true,
        "message_text" : "Hi",
        "partner" : { "country_code" : "za",
            "gender" : "male",
            "nickname" : "nick",
            "profile_pic_full_size_url" : "xxxxxx.mobi/pic.php?id=810a5e9f6e7065cd43629f1",
            "profile_pic_url" : "xxxxxx.mobi/pic.php?id=23ca67a44d23",
            "profile_summary" : "20,  DBN"
          },
        "shoutout_id" : 31170,
        "type" : "shoutout"
      },
      { "attachment_url" : null,
        "attachment_url_full_size" : null,
        "expires_at" : 1363264081,
        "have_attachment" : false,
        "message_text" : "hello",
        "partner" : { "country_code" : "za",
            "gender" : "male",
            "nickname" : "mark",
            "profile_pic_full_size_url" : "xxxxxx.mobi/pic.php?id=2db9e7f86b9bf7ca",
            "profile_pic_url" : "xxxxxx.mobi/pic.php?id=b110191f1afac",
            "profile_summary" : "40,  DBN"
          },
        "shoutout_id" : 31322,
        "type" : "shoutout"
      }
    ]
}

Stacktrace:

 03-14 14:56:02.200: E/AndroidRuntime(19588): FATAL EXCEPTION: main
    03-14 14:56:02.200: E/AndroidRuntime(19588): java.lang.RuntimeException: Unable to start activity ComponentInfo{mobi.smiggle.android/mobi.smiggle.android.MainFragmentActivity}: java.lang.IllegalArgumentException: class android.text.BoringLayout declares multiple JSON fields named m_paint
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at android.os.Handler.dispatchMessage(Handler.java:99)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at android.os.Looper.loop(Looper.java:137)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at android.app.ActivityThread.main(ActivityThread.java:4507)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at java.lang.reflect.Method.invokeNative(Native Method)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at java.lang.reflect.Method.invoke(Method.java:511)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at dalvik.system.NativeStart.main(Native Method)
    03-14 14:56:02.200: E/AndroidRuntime(19588): Caused by: java.lang.IllegalArgumentException: class android.text.BoringLayout declares multiple JSON fields named m_paint
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.Gson.getAdapter(Gson.java:353)
    03-14 14:56:02.200: E/AndroidRuntime(19588):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:

解决方案

I've found, that if your instance t extends from any android view component(such as Button, for example) or has field of class, that extends from any android view component, you will get such exception

For some reason, this library can't serialize view components any more. So, you can add exclude strategy. For example, this strategy will exclude all fields, except fields with Annotation @SerializedName:

class Exclude implements ExclusionStrategy {

@Override
public boolean shouldSkipClass(Class<?> arg0) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean shouldSkipField(FieldAttributes field) {
    SerializedName sn = field.getAnnotation(SerializedName.class);
    if(sn != null)
        return false;
    return true;
}}

Suppose we have sample Json:

private final String jsonSample= "{ \"Sample\": { \"field1\":1, \"field2\":2}}";

here is sample code:

 private void parseJson(){
    Exclude ex = new Exclude();
    Gson gson = new GsonBuilder().create();

    GsonObject gObject = gson.fromJson(jsonSample, GsonObject.class);

}

class GsonObject{
    @SerializedName("Sample")
    public Smpl smpl;

//  private Button btn;  <-- Uncomment this line, and you will get your error!

    class Smpl{
        @SerializedName("field1")
        int fl1;
        @SerializedName("field2")
        int fl2;
    }
}

But after adding exclude strategy I've written above:

    Exclude ex = new Exclude();
    Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();

All works correct.

Finally we has the following test app:

public class MainActivity extends Activity {

private final String jsonSample= "{ \"Sample\": { \"field1\":1, \"field2\":2}}";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    parseJson();
}

private void parseJson(){
    Exclude ex = new Exclude();
//  Gson gson = new GsonBuilder().create(); <-- without EX strategy it will try to serrialaze Button field in our GsonObject, and throws an exeption
    Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();

    GsonObject gObject = gson.fromJson(jsonSample, GsonObject.class);

    Toast.makeText(this, "Gson" + gObject.smpl.fl1 + " " + gObject.smpl.fl2, Toast.LENGTH_LONG).show();

}

class GsonObject{
    @SerializedName("Sample")
    public Smpl smpl;

    private Button btn; // <-- this field is our reason of this strange exception on Gson serialization

    class Smpl{
        @SerializedName("field1")
        int fl1;
        @SerializedName("field2")
        int fl2;
    }
}
}

class Exclude implements ExclusionStrategy {

    @Override
    public boolean shouldSkipClass(Class<?> arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean shouldSkipField(FieldAttributes field) {
        SerializedName ns = field.getAnnotation(SerializedName.class);
        if(ns != null)
            return false;
        return true;
    }

}

p.s. Sorry for my English)

这篇关于GSON略知&GT异常; 4.0设备的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆