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方法提取快速 ...
随机推荐
- 31. Next Permutation 返回下一个pumutation序列
[抄题]: Implement next permutation, which rearranges numbers into the lexicographically next greater p ...
- Spark官方文档翻译(一)~Overview
Spark官方文档翻译,有问题请及时指正,谢谢. Overview页 http://spark.apache.org/docs/latest/index.html Spark概述 Apache Spa ...
- cpp 区块链模拟示例(一)工程建立
/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ window ...
- CSS样式简介
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可以静态 ...
- python中None与0、Null、false区别
None是Python中的一个关键字,None本身也是个一个数据类型,而这个数据类型就是None,它可0.空字符串以及false均不一样,这些都只是对象,而None也是一个类. 给个bool测试: v ...
- 汇编语言计算Sin,Cos,Pow函数
填了一下之前的坑.首先是一个题外话,在VS2015中默认汇编代码会使用SSE生成,如果想用FPU编译出FLD,FSTP这些指令,需要设置一下. 项目 >> 属性 >> C/C+ ...
- JAVA 8 主要新特性 ----------------(一)总纲
一.版本中数据结构的修改浅析 二.JDK1.8优点概括 三.新功能Lambda表达式入门 四.Lambda函数式接口 五.Lambda方法引用与构造器引用 六.集合Stream API 七.新时间日期 ...
- CSS Grid
效果图如上所示 <!DOCTYPE html> <html> <head> <title>练习</title> </head> ...
- std::string的拷贝赋值研究
说明:以下涉及的std::string的源代码摘自4.8.2版本.结论:std::string的拷贝复制是基于引用计数的浅拷贝,因此它们指向相同的数据地址. // std::string类定义type ...
- MFC控件的颜色设置
在绘制控件颜色时,控件会发送WM_CTLCOLOR消息给父窗口,父窗口收到消息后,映射到OnCtlColor()函数中处理. 该函数返回一个画刷用于设置子控件的背景颜色,子控件再执行自己的CtlCol ...