當解析Json數據時,如果碰到同字段不同數據類型的情況,如何處理呢?比如:
[
{
"code": 1,
"data": 33
},
{
"code": 2,
"data": "string"
},
{
"code": 3,
"data": { "age": 22, "name": "rc" }
}
]
解析思路:將data聲明為Object類型,然后取值的時候,通過instanceof判斷屬於哪種類型。
解析步驟
在項目的assets目錄中新建parseDataJson.json文件,內容為上面的json數據。
創建model類
package com.why.project.androidcnblogsdemo.model; /** * Created by HaiyuKing * Used 解析data字段分別賦值Integer、String、JsonObject對象數據的JsonObject對象 */ public class ParseDataModel { private int code; private Object data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:text="顯示JSONObject數據" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_show" android:layout_gravity="center_horizontal"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_show" android:hint="此處顯示JSONObject數據"/> </LinearLayout>
activity中代碼
package com.why.project.androidcnblogsdemo.activity; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.why.project.androidcnblogsdemo.R; import com.why.project.androidcnblogsdemo.model.ParseDataModel; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.ArrayList; /** * Created by HaiyuKing * Used 解析data字段分別賦值Integer、String、JsonObject對象數據的JsonObject對象 */ public class ParseDataActivity extends AppCompatActivity { private static final String TAG = "ParseDataActivity"; private Button mShowBtn; private TextView mShowTv; private ArrayList<ParseDataModel> jsonDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_parsedata); initViews(); initData(); initEvents(); } private void initViews() { mShowBtn = (Button) findViewById(R.id.btn_show); mShowTv = (TextView) findViewById(R.id.tv_show); } private void initData() { jsonDataList = new ArrayList<ParseDataModel>(); //從Assets中獲取json數據字符串 String jsonData = getStringFromAssert(this,"parseDataJson.json"); Log.e(TAG,"jsonData="+jsonData); //解析json格式的字符串 try { JSONArray jsonDataArray = new JSONArray(jsonData); if(jsonDataArray.length() > 0){ for(int i=0; i<jsonDataArray.length();i++){ JSONObject jsonDataItemObj = jsonDataArray.getJSONObject(i); ParseDataModel model = new ParseDataModel(); model.setCode(jsonDataItemObj.getInt("code")); model.setData(jsonDataItemObj.get("data")); jsonDataList.add(model); } } } catch (JSONException e) { e.printStackTrace(); } //方案二,通過Gson解析,不過只能解析出來String類型,其他類型均為Object //https://segmentfault.com/q/1010000002779358 // try { // JSONArray jsonDataArray = new JSONArray(jsonData); // if(jsonDataArray.length() > 0){ // for(int i=0; i<jsonDataArray.length();i++){ // jsonDataList.add(new Gson().fromJson(jsonDataArray.getString(i),ParseDataModel.class)); // } // } // // } catch (JSONException e) { // e.printStackTrace(); // } //http://www.cnblogs.com/zhujiabin/p/4660828.html // Type listType = new TypeToken<LinkedList<ParseDataModel>>(){}.getType(); // Gson gson = new Gson(); // LinkedList<ParseDataModel> parseDataModelsList = gson.fromJson(jsonData, listType); // // String showResult = ""; // // for (Iterator iterator = parseDataModelsList.iterator(); iterator.hasNext();) { // ParseDataModel model = (ParseDataModel) iterator.next(); // int code = model.getCode(); // Object data = model.getData(); // String dataType = "Object"; // if(data instanceof Integer){ // data = (Integer)data; // dataType = "Integer"; // }else if(data instanceof String){ // data = (String)data; // dataType = "String"; // }else if(data instanceof JSONObject){ // data = (JSONObject)data; // dataType = "JSONObject"; // } // showResult += "code=" + code + ";data=" + data + "【dataType=" + dataType + "】\n"; // } // mShowTv.setText(showResult); } private void initEvents() { mShowBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String showResult = ""; //循環獲取json數據 for(int i = 0;i<jsonDataList.size();i++){ ParseDataModel model = jsonDataList.get(i); int code = model.getCode(); Object data = model.getData(); String dataType = "Object"; if(data instanceof Integer){ data = (Integer)data; dataType = "Integer"; }else if(data instanceof String){ data = (String)data; dataType = "String"; }else if(data instanceof JSONObject){ data = (JSONObject)data; dataType = "JSONObject"; } showResult += "code=" + code + ";data=" + data + "【dataType=" + dataType + "】\n"; } mShowTv.setText(showResult); } }); } /** * 訪問assets目錄下的資源文件,獲取文件中的字符串 * @param assetsFilePath - 文件的相對路徑,例如:"listitemdata.txt或者"/why/listdata.txt" * @return 內容字符串 * */ public static String getStringFromAssert(Context mContext, String assetsFilePath) { String content = ""; // 結果字符串 try { InputStream is = mContext.getResources().getAssets().open(assetsFilePath);// 打開文件 int ch = 0; ByteArrayOutputStream out = new ByteArrayOutputStream(); // 實現了一個輸出流 while ((ch = is.read()) != -1) { out.write(ch); // 將指定的字節寫入此 byte 數組輸出流 } byte[] buff = out.toByteArray();// 以 byte 數組的形式返回此輸出流的當前內容 out.close(); // 關閉流 is.close(); // 關閉流 content = new String(buff, "UTF-8"); // 設置字符串編碼 } catch (Exception e) { Toast.makeText(mContext, "對不起,沒有找到指定文件!", Toast.LENGTH_SHORT) .show(); } return content; } }
效果圖