• Json数据中同字段不同数据类型的解析


    当解析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 + "】
    ";
    //        }
    //        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 + "】
    ";
                    }
                    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;
        }
    }

     效果图

     

  • 相关阅读:
    【学习小记】一般图最大匹配——带花树算法
    如何检查oracle的归档空间是否满了
    Linux 的计划任务
    转 oracle的热备份和冷备份
    SQLException: Io 异常: Connection refused ERR=12514 ERR=1153异常处理过程
    查看oracle数据库版本
    ORACLE默认实例设置--linux
    oracle查看用户属于哪个表空间
    oracle默认数据库实例
    oracle 查看用户所在的表空间
  • 原文地址:https://www.cnblogs.com/whycxb/p/7789196.html
Copyright © 2020-2023  润新知