当解析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;
}
}

效果图

Json数据中同字段不同数据类型的解析的更多相关文章

  1. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  2. 我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

    1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...

  3. 处理Json数据中的日期类型.如/Date(1415169703000)/格式

    在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...

  4. C# 实体类转json数据过滤掉字段为null的字段

    C# 实体类转json数据过滤掉字段为null的字段 语法如下: var jsonSetting = new JsonSerializerSettings {NullValueHandling = N ...

  5. C#调用接口返回json数据中含有双引号 或其他非法字符的解决办法

    这几天,调用别人接口返回json数据含有特殊符号(双引号),当转换成json对象总是报错, json字符格式如下 { "BOXINFO":[ { ", "ITE ...

  6. 解决后台json数据返回的字段需要替换的问题

    有时候后台json数据返回的字段含有“id”,也有可能是有时候为了减少代码的冗余,两页面之间只是数据模型个别属性的区别,所以这时候最好是用到模型属性的替换,用新的属性替换返回的json数据的字段.这里 ...

  7. 从JSON数据中取出相关数据

    参考: http://www.cnblogs.com/shuilangyizu/p/6019561.html JSON数据如下: { "total": 1, "rows& ...

  8. SSM框架关于后台返回JSON数据中显示很多不需要的字段为NULL

    xml 配置 spring mvc 的 json 返回忽略 null 字段 <mvc:annotation-driven> <mvc:message-converters regis ...

  9. JsonPath如何获取JSON数据中的值

    场景: 发送接口请求后,得到请求结果值是Json数据, 需要从Json数据信息中提取字段值. 响应值字符与字符之间有空格,导致用正则表达式方法提取比较麻烦,于是用java的JsonPath方法提取快速 ...

随机推荐

  1. ggplot2 梯度作图

    ggplot2是R语言的绘图包 library('ggplot2') df <- data.frame(var=c("a","b","c&quo ...

  2. swift - UIButton按钮有图片是点击高亮 有灰色动画

    取消 高亮的 动画 btn.adjustsImageWhenHighlighted = false btn.layer.removeAllAnimations()

  3. Myisam 和 Innodb 区别

    MySQL默认采用的是MyISAM. MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以 ...

  4. Linux驱动之输入子系统简析

    输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspac ...

  5. The best way to use Xtool X100 PAD2 for FEM programming

    Look here: XTOOL X100 PAD2 is new FEM programming. Possible to use Xtool X100 PAD2 for FEM programmi ...

  6. day0-功能自动化的前提

    自动化不是万能的,不是什么产品都适合自动化测试,那些产品适合自动化测试? 只要满足下面三个条件就可以进行自动化测试 一:软件需求变动不频繁 二:项目周期较长 自动化测试框架的设计.脚本的开发与调试需要 ...

  7. web工程was部署

    web.xml调整: 新增如下servlet <servlet> <servlet-name>SimpleFileServlet</servlet-name> &l ...

  8. 借助Algorithmia网站API:用AI给黑白照片上色,复现记忆中的旧时光

    先看DEMOhttps://demos.algorithmia.com/colorize-photos/ 了解ColorfulImageColorizationhttps://algorithmia. ...

  9. 达里奥:典型的去杠杆化过程是怎么进行的zz

    猛人RayDalio的“三部曲”之三:关于去杠杆化的深入理解 作者系统地阐述了去杆杠化过程并深入探讨去杆杠化的运作机理,对我们理解当前全球乃至中国.即将或者已经面临的去杠杆化过程,应当能够带来一些帮助 ...

  10. (PMP)第6章-----项目进度管理

    6.1 规划进度管理 输入 工具与技术 输出 1.项目章程 2.项目管理计划 (范围管理计划, 开发方法) 3.事业环境因素 4.组织过程资产 1.专家判断 2.数据分析 3.会议 1.进度管理计划 ...