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方法提取快速 ...
随机推荐
- mysql-8.0.15-winx64 解压版安装 图文详解
1.官网下载 https://dev.mysql.com/downloads/mysql/ 2.解压到合适的目录 3.配置环境变量 ①. path ②.MYSQL_HOME 4.新建一个my.ini ...
- [原]CentOS 7.2 1511部署L2TP/IPsec服务器及客户端
快过年了,感觉从去年开始,我们公司就变成了“别人的公司”,基本上提前一星期就放假了,好开心.正好可以利用这一段时间,把前段时间一些疑惑的问题解决下:) 然而挡在面前的一个拦路虎是:很多时候不能愉快的G ...
- CentOS上部署.net core
1.阿里云更换系统安装CentOS7.4 64位版本 2.试用XShell 5 登录服务器 参考https://www.microsoft.com/net/learn/get-started/linu ...
- springMVC学习 十二 拦截器
一 拦截器概述 拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能.但是和Spring中的Aop技术是由区别的.AOP 在特定方法前后扩充(一 ...
- spring-boot json数据交互
SpringBoot学习之Json数据交互 最近在弄监控主机项目,对javaweb又再努力学习.实际的项目场景中,前后分离几乎是所以项目的标配,全栈的时代的逐渐远去,后端负责业务逻辑处理,前端负责数据 ...
- Selenium webdriver操作日历控件
一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期, 1. 定位到该input 2. 使用sendKeys 方法 比如:使用定位: driver.findElement ...
- Python开发——7.迭代器、生成器和装饰器
一.迭代器 1.迭代器协议 (1)迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个StopIteration移除异常以中止迭代. (2)可迭代对象:实现了迭 ...
- python_day1_变量
一.变量 定义: 通俗来讲可变化的量称之为变量,专业的解释为:把程序运算的中间结果临时存到内存里,以备后面的代码继续调用,这几个名字的学名就叫做“变量” 用法: name = 'zzx' 其中name ...
- 第四周Access的总结
一.问;这节课你学到了什么知识? 答:这周我们学习了新的课程:表的建立和管理.这是Access最重要的一部份,需要我们认认真真学习! 字段是表最重要的信息,而数据类型是字段或表中 ...
- Springmvc <mvc:cros>和<mvc:intercepters>同时使用时,跨域被拦截了
问题原因:cros也是使用拦截器实现的,并且拦截器配置最后一个处理,导致在跨域处理之前调用了业务拦截器 解决方案:推荐使用http://software.dzhuvinov.com/cors-filt ...