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 + "】\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数据中同字段不同数据类型的解析的更多相关文章
- 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 ...
- 我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题
1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...
- 处理Json数据中的日期类型.如/Date(1415169703000)/格式
在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...
- C# 实体类转json数据过滤掉字段为null的字段
C# 实体类转json数据过滤掉字段为null的字段 语法如下: var jsonSetting = new JsonSerializerSettings {NullValueHandling = N ...
- C#调用接口返回json数据中含有双引号 或其他非法字符的解决办法
这几天,调用别人接口返回json数据含有特殊符号(双引号),当转换成json对象总是报错, json字符格式如下 { "BOXINFO":[ { ", "ITE ...
- 解决后台json数据返回的字段需要替换的问题
有时候后台json数据返回的字段含有“id”,也有可能是有时候为了减少代码的冗余,两页面之间只是数据模型个别属性的区别,所以这时候最好是用到模型属性的替换,用新的属性替换返回的json数据的字段.这里 ...
- 从JSON数据中取出相关数据
参考: http://www.cnblogs.com/shuilangyizu/p/6019561.html JSON数据如下: { "total": 1, "rows& ...
- SSM框架关于后台返回JSON数据中显示很多不需要的字段为NULL
xml 配置 spring mvc 的 json 返回忽略 null 字段 <mvc:annotation-driven> <mvc:message-converters regis ...
- JsonPath如何获取JSON数据中的值
场景: 发送接口请求后,得到请求结果值是Json数据, 需要从Json数据信息中提取字段值. 响应值字符与字符之间有空格,导致用正则表达式方法提取比较麻烦,于是用java的JsonPath方法提取快速 ...
随机推荐
- vue 和 react 路由跳转和传参
react 1 .跳转方式加传参 this.props.history.push({ //地址 pathname: '/film/Details', //路由传参 ...
- css3回顾 checkbox
<div class="checkBox"> <input type="checkbox" id="check1"> ...
- (转)android import library switch语句报错case expressions must be constant expressions
今天当我从github上下载一个工程,并把它的库文件导入eclipse中,发现switch语句报错case expressions must be constant expressions : 解决方 ...
- springboot中使用ContextLoaderListener.getCurrentWebApplicationContext();获取WebApplicationContext为空问题
WebApplicationContext applicationContext = ContextLoaderListener.getCurrentWebApplicationContext(); ...
- Python:每日一题007
题目: 输出 9*9 乘法口诀表. 程序分析: 分行与列考虑,共9行9列,i控制行,j控制列. 个人思路及代码: 第一版: for i in range(1,10): for j in range(1 ...
- 使用Maven搭建SpringMVC
1.创建Maven Project 注意选择webapp 2.添加Maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0&q ...
- linux命令_文件目录操作命令
# linux命令--文件和目录操作命令 pwd "print working directory" 打印工作目录的绝对路径 范例: 在bash命令行显示当前用户的完整路径 系统B ...
- docker知识点杂记
最近重新梳理了一下docker的一些基本知识,简单做了下总结.以后会逐步补充. 1.查看系统内核版本,需要3.10以上 $ uname -r 2.下载docker 说明:centos安装docker比 ...
- ReactNative学习笔记(三)打包、调试、运行等相关介绍
各种命令 个人习惯在项目根目录下把一些常见命令写成bat文件,以后每次要执行什么只需要双击即可: 编译.生成.运行并启动packager(debug模式): react-native run-andr ...
- 人工智能必须要知道的语义分割模型:DeepLabv3+
图像分割是计算机视觉中除了分类和检测外的另一项基本任务,它意味着要将图片根据内容分割成不同的块.相比图像分类和检测,分割是一项更精细的工作,因为需要对每个像素点分类,如下图的街景分割,由于对每个像素点 ...