Json数据中同字段不同数据类型的解析
2017-11-05 22:38
555 查看
当解析Json数据时,如果碰到同字段不同数据类型的情况,如何处理呢?比如:
解析思路:将data声明为Object类型,然后取值的时候,通过instanceof判断属于哪种类型。
![](https://images2017.cnblogs.com/blog/93830/201711/93830-20171105223219560-1241268129.png)
[ { "code": 1, "data": 33 }, { "code": 2, "data": "string" }, { "code": 3, "data": { "age": 22, "name": "rc" } } ]
解析思路:将data声明为Object类型,然后取值的时候,通过instanceof判断属于哪种类型。
解析步骤
在项目的assets目录中新建parseDataJson.json文件,内容为上面的json数据。
![](https://images2017.cnblogs.com/blog/93830/201711/93830-20171105223219560-1241268129.png)
创建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; } }
效果图
![](https://images2017.cnblogs.com/blog/93830/201711/93830-20171105223602248-1683046576.png)
相关文章推荐
- Gson+retrofit解析同一位置不同类型的json数据
- ajaxfileupload以JSON为返回数据类型出现的因符号无法解析的错误的解决方案
- 后台转换JSON数据类型,前台解析JSON数据
- JSON数据解析类型
- 遇见多种类型的json数据的解析----总结V2版
- js读取并解析JSON类型数据的方法
- Jquery下Json数据的传递与解析(asp.net mvc与asp.net api下后台json接收方式的不同)
- js 将json字符串转换为json对象的方法解析 作者: 字体:[增加 减小] 类型:转载 将json字符串转换为json对象的方法。在数据传输过程中,json是以文本,即字符串的形式传递的,而J
- js读取解析JSON类型数据
- 解析JSON格式的数据时,有的字段为空值
- 用js解析经json序列化后的C#的DateTime类型数据
- 【Spring-boot 】FastJson对json数据进行解析(类型转换)
- mybatis insert 日期类型字段入库,实际日期数据格式有不同
- iOS开发中解析JSON中的boolean类型的数据遇到的问题
- Jquery下Json数据的传递与解析(asp.net mvc与asp.net api下后台json接收方式的不同)
- Oracle中通过存储过程,Function,触发器实现解析时间类型的字段并插入的对应的数据表中
- 解析一个数组JsonArray下有多种数据类型JsonObject的Json
- js读取解析JSON类型数据
- XML数据解析方式各有什么不同,JSON解析有哪些框架?
- 不同数据库表插入字段类型为LONG的数据