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