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方法提取快速 ...
随机推荐
- [leetcode]22. Generate Parentheses生成括号
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 微软Office Online服务安装部署(三)
现在开始配置两台服务器,两台服务器的IP: Server: 10.1.3.89 Client: 10.1.3.92 1.在Client中,.打开网络属性,找到ipv4的配置,将dns 改成域控制器的 ...
- 代码之髓读后感——类&继承
面向对象 语言中的用语并不是共通的,在不同语言中,同一个用语的含义可能会有很大差别. C++的设计者本贾尼·斯特劳斯特卢普对类和继承给予了正面肯定,然而,"面向对象"这个词的发明者 ...
- HDU2028
#include <bits/stdc++.h> using namespace std; ; int gcd(int a, int b) { ? b:gcd(b, a%b); } int ...
- Linux module 添加到bashrc 和临时ifort编译器 以及python2和3的配置
第一步vim ~/.bashrc按键盘的i然后source /home/export/online1/bjpara/para/modules/scripts/cn-module.sh最后:x! bas ...
- 借助Algorithmia网站API:用AI给黑白照片上色,复现记忆中的旧时光
先看DEMOhttps://demos.algorithmia.com/colorize-photos/ 了解ColorfulImageColorizationhttps://algorithmia. ...
- 利用iptables防止ssh暴力破解和控制网速
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --setiptables -I INPUT -p ...
- 图解HTTP第五章
与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1>用单台虚拟主机实现多个域名 HTTP/1.1 规范 ...
- C#Dictionary源码
Dictionary Dictionary与hashtable的区别:dictionary支持泛型. 通常处理哈希冲突的方法有:开放地址法,再哈希法,链地址法,建立一个公共栈区等. 在哈希表上进行查 ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十八之铭文升级版
铭文一级: 功能二:功能一+从搜索引擎引流过来的 HBase表设计create 'imooc_course_search_clickcount','info'rowkey设计:也是根据我们的业务需求来 ...