Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Gson在>;4.0设备_Android_Gson - Fatal编程技术网

Android Gson在>;4.0设备

Android Gson在>;4.0设备,android,gson,Android,Gson,我正在使用Gson成功地将json放置到对象中。它在android 2.2(emulator和real device)的设备上就像一个魔咒,当我部署到android 4.0和更高版本(emulator和device)时,我得到了一个非常奇怪的例外 我已经确认json字符串没有问题,因为相同的代码在旧设备上运行得很好 这里肯定会抛出异常: Gson Gson=new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_,带

我正在使用Gson成功地将json放置到对象中。它在android 2.2(emulator和real device)的设备上就像一个魔咒,当我部署到android 4.0和更高版本(emulator和device)时,我得到了一个非常奇怪的例外

我已经确认json字符串没有问题,因为相同的代码在旧设备上运行得很好

这里肯定会抛出异常:

Gson Gson=new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_,带下划线)。create();
返回gson.fromJson(jsonString,t)

在fromJson方法中

有什么想法吗

Json字符串:(必须从Json中的URL中删除http://) { "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" } ] } {“会话id”:“a89d8cd07e356”, “shoutout_items”:[{“附件_url”:“xxxxxx.mobi/pic.php?id=478ba67a44d”, “附件url全尺寸”:“xxxxxx.mobi/pic.php?id=01810a5e9f6e7065cd4”, “到期时间”:1363264081, “有依恋”:对, “信息文字”:“您好”, “合作伙伴”:{“国家代码”:“za”, “性别”:“男性”, “昵称”:“尼克”, “profile_pic_full_size_url”:“xxxxxx.mobi/pic.php?id=810a5e9f6e7065cd43629f1”, “profile_pic_url”:“xxxxxx.mobi/pic.php?id=23ca67a44d23”, “概况摘要”:“20,DBN” }, “shoutou_id”:31170, “类型”:“shoutout” }, {“附件url”:空, “附件url完整大小”:空, “到期时间”:1363264081, “有附件”:错误, “短信”:“你好”, “合作伙伴”:{“国家代码”:“za”, “性别”:“男性”, “昵称”:“马克”, “profile_pic_full_size_url”:“xxxxxx.mobi/pic.php?id=2db9e7f86b9bf7ca”, “profile_pic_url”:“xxxxxx.mobi/pic.php?id=b110191f1afac”, “概况摘要”:“40,DBN” }, “shoutou_id”:31322, “类型”:“shoutout” } ] }

堆栈跟踪:

 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:
03-14 14:56:02.200:E/AndroidRuntime(19588):致命异常:main
03-14 14:56:02.200:E/AndroidRuntime(19588):java.lang.RuntimeException:无法启动活动组件信息{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.Invokenactive(本机方法)
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:class android.text.BoringLayout声明了多个名为m_paint的JSON字段
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.getBoundFields(ReflectTypeAdapterFactory.java:122)
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.create(ReflectTypeAdapterFactory.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.ReflectTypeAdapterFactory$1。(ReflectTypeAdapterFactory.java:82)
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.CreateBundfield(ReflectTypeAdapterFactory.java:81)
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.getBoundFields(ReflectTypeAdapterFactory.java:118)
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.create(ReflectTypeAdapterFactory.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.ReflectTypeAdapterFactory$1。(ReflectTypeAdapterFactory.java:82)
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.CreateBundfield(ReflectTypeAdapterFactory.java:81)
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.getBoundFields(ReflectTypeAdapterFactory.java:118)
03-14 14:56:02.200:E/AndroidRuntime(19588):位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.create(ReflectTypeAdapterFactory.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.reflecivety
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;
}}
private final String jsonSample= "{ \"Sample\": { \"field1\":1, \"field2\":2}}";
 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;
    }
}
    Exclude ex = new Exclude();
    Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
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;
    }

}