1. 程式人生 > >Android list 泛型 用Gson 轉json字串 出現 java.lang.StackOverflowError異常解決

Android list 泛型 用Gson 轉json字串 出現 java.lang.StackOverflowError異常解決

 不廢話 第一次寫部落格,不知道怎麼寫,  直接進入主題

我來這最熟悉的程式碼

	@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());
		}
	}

好吧就寫到這裡,  希望遇到這個問題能看懂我這篇文章,寫的實在不好。