Android list 泛型 用Gson 轉json字串 出現 java.lang.StackOverflowError異常解決
阿新 • • 發佈:2019-01-07
不廢話 第一次寫部落格,不知道怎麼寫, 直接進入主題
我來這最熟悉的程式碼
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); } private void initUI() { save = (Button) findViewById(R.id.save); read = (Button) findViewById(R.id.read); textView = (TextView) findViewById(R.id.textview); save.setOnClickListener(this); read.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.save: initData(); break; case R.id.read: break; } } private void initData() { // TODO Auto-generated method stub LinkedList<MyTrafficDetailsBin> detailsBins=new LinkedList<MyTrafficDetailsBin>(); for (int i = 0; i < 20; i++) { MyTrafficDetailsBin bin=new MyTrafficDetailsBin(i, "名稱:"+i, "時間:"+i, "appname:"+i); detailsBins.add(bin); } Gson gson=new Gson(); String json = gson.toJson(detailsBins); Log.e("儲存資料:", json); }
這樣直接轉的話會出現異常java.lang.StackOverflowError 堆疊溢位
於是我在網上找了很多答案也沒有找到明確的處理方法,也查詢了導致這個錯誤的真正原因,這裡就不貼出來了,
後來查看了一些寫部落格比較火的人他們寫的文章,還是不適合廢話直接上解決方案吧
private void initData() { // TODO Auto-generated method stub LinkedList<MyTrafficDetailsBin> detailsBins=new LinkedList<MyTrafficDetailsBin>(); for (int i = 0; i < 20; i++) { MyTrafficDetailsBin bin=new MyTrafficDetailsBin(i, "名稱:"+i, "時間:"+i, "appname:"+i); detailsBins.add(bin); } Gson gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() //不匯出實體中沒有用@Expose註解的屬性 .enableComplexMapKeySerialization() // .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")// .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//
.setPrettyPrinting() //對json結果格式化.
.setVersion(1.0).
create();
String json = gson.toJson(detailsBins);
Log.e("儲存資料:", json);
}
請求注意了 你的 list裡面的物件類 一定要@Expose註解屬性,不然你的欄位全都為null, 當然你不需要的欄位就不要註解了,
讀取儲存的資料也是這樣
private void initData() { // TODO Auto-generated method stub LinkedList<MyTrafficDetailsBin> detailsBins=new LinkedList<MyTrafficDetailsBin>(); for (int i = 0; i < 20; i++) { MyTrafficDetailsBin bin=new MyTrafficDetailsBin(i, "名稱:"+i, "時間:"+i, "appname:"+i); detailsBins.add(bin); } Gson gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() //不匯出實體中沒有用@Expose註解的屬性 .enableComplexMapKeySerialization() //
.serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//
.setPrettyPrinting() //對json結果格式化.
.setVersion(1.0).
create();
String json = gson.toJson(detailsBins);
Log.e("儲存資料:", json);
Type typeOfT=new TypeToken<LinkedList<MyTrafficDetailsBin>>(){}.getType();
LinkedList<MyTrafficDetailsBin> bins=gson.fromJson(json, typeOfT);
for (int i = 0; i < bins.size(); i++) {
Log.e("顯示資料appname:", bins.get(i).getAppname());
}
}
好吧就寫到這裡, 希望遇到這個問題能看懂我這篇文章,寫的實在不好。