当解析Json数据时,如果碰到同字段不同数据类型的情况,如何处理呢?比如:

  1. [
  2. {
  3. "code": 1,
  4. "data": 33
  5. },
  6. {
  7. "code": 2,
  8. "data": "string"
  9. },
  10. {
  11. "code": 3,
  12. "data": {
  13. "age": 22,
  14. "name": "rc"
  15. }
  16. }
  17. ]

解析思路:将data声明为Object类型,然后取值的时候,通过instanceof判断属于哪种类型。

解析步骤

在项目的assets目录中新建parseDataJson.json文件,内容为上面的json数据。

创建model类

  1. package com.why.project.androidcnblogsdemo.model;
  2.  
  3. /**
  4. * Created by HaiyuKing
  5. * Used 解析data字段分别赋值Integer、String、JsonObject对象数据的JsonObject对象
  6. */
  7.  
  8. public class ParseDataModel {
  9.  
  10. private int code;
  11. private Object data;
  12.  
  13. public int getCode() {
  14. return code;
  15. }
  16.  
  17. public void setCode(int code) {
  18. this.code = code;
  19. }
  20.  
  21. public Object getData() {
  22. return data;
  23. }
  24.  
  25. public void setData(Object data) {
  26. this.data = data;
  27. }
  28. }

布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:orientation="vertical"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7.  
  8. <Button
  9. android:text="显示JSONObject数据"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:id="@+id/btn_show"
  13. android:layout_gravity="center_horizontal"/>
  14.  
  15. <TextView
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:id="@+id/tv_show"
  19. android:hint="此处显示JSONObject数据"/>
  20. </LinearLayout>

activity中代码

  1. package com.why.project.androidcnblogsdemo.activity;
  2.  
  3. import android.content.Context;
  4. import android.os.Bundle;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10. import android.widget.Toast;
  11.  
  12. import com.why.project.androidcnblogsdemo.R;
  13. import com.why.project.androidcnblogsdemo.model.ParseDataModel;
  14.  
  15. import org.json.JSONArray;
  16. import org.json.JSONException;
  17. import org.json.JSONObject;
  18.  
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.InputStream;
  21. import java.util.ArrayList;
  22.  
  23. /**
  24. * Created by HaiyuKing
  25. * Used 解析data字段分别赋值Integer、String、JsonObject对象数据的JsonObject对象
  26. */
  27.  
  28. public class ParseDataActivity extends AppCompatActivity {
  29.  
  30. private static final String TAG = "ParseDataActivity";
  31.  
  32. private Button mShowBtn;
  33. private TextView mShowTv;
  34.  
  35. private ArrayList<ParseDataModel> jsonDataList;
  36.  
  37. @Override
  38. protected void onCreate(Bundle savedInstanceState) {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_parsedata);
  41.  
  42. initViews();
  43. initData();
  44. initEvents();
  45. }
  46.  
  47. private void initViews() {
  48. mShowBtn = (Button) findViewById(R.id.btn_show);
  49. mShowTv = (TextView) findViewById(R.id.tv_show);
  50. }
  51.  
  52. private void initData() {
  53.  
  54. jsonDataList = new ArrayList<ParseDataModel>();
  55. //从Assets中获取json数据字符串
  56. String jsonData = getStringFromAssert(this,"parseDataJson.json");
  57. Log.e(TAG,"jsonData="+jsonData);
  58. //解析json格式的字符串
  59. try {
  60. JSONArray jsonDataArray = new JSONArray(jsonData);
  61. if(jsonDataArray.length() > 0){
  62. for(int i=0; i<jsonDataArray.length();i++){
  63. JSONObject jsonDataItemObj = jsonDataArray.getJSONObject(i);
  64. ParseDataModel model = new ParseDataModel();
  65. model.setCode(jsonDataItemObj.getInt("code"));
  66. model.setData(jsonDataItemObj.get("data"));
  67.  
  68. jsonDataList.add(model);
  69. }
  70. }
  71.  
  72. } catch (JSONException e) {
  73. e.printStackTrace();
  74. }
  75.  
  76. //方案二,通过Gson解析,不过只能解析出来String类型,其他类型均为Object
  77. //https://segmentfault.com/q/1010000002779358
  78. // try {
  79. // JSONArray jsonDataArray = new JSONArray(jsonData);
  80. // if(jsonDataArray.length() > 0){
  81. // for(int i=0; i<jsonDataArray.length();i++){
  82. // jsonDataList.add(new Gson().fromJson(jsonDataArray.getString(i),ParseDataModel.class));
  83. // }
  84. // }
  85. //
  86. // } catch (JSONException e) {
  87. // e.printStackTrace();
  88. // }
  89.  
  90. //http://www.cnblogs.com/zhujiabin/p/4660828.html
  91. // Type listType = new TypeToken<LinkedList<ParseDataModel>>(){}.getType();
  92. // Gson gson = new Gson();
  93. // LinkedList<ParseDataModel> parseDataModelsList = gson.fromJson(jsonData, listType);
  94. //
  95. // String showResult = "";
  96. //
  97. // for (Iterator iterator = parseDataModelsList.iterator(); iterator.hasNext();) {
  98. // ParseDataModel model = (ParseDataModel) iterator.next();
  99. // int code = model.getCode();
  100. // Object data = model.getData();
  101. // String dataType = "Object";
  102. // if(data instanceof Integer){
  103. // data = (Integer)data;
  104. // dataType = "Integer";
  105. // }else if(data instanceof String){
  106. // data = (String)data;
  107. // dataType = "String";
  108. // }else if(data instanceof JSONObject){
  109. // data = (JSONObject)data;
  110. // dataType = "JSONObject";
  111. // }
  112. // showResult += "code=" + code + ";data=" + data + "【dataType=" + dataType + "】\n";
  113. // }
  114. // mShowTv.setText(showResult);
  115. }
  116.  
  117. private void initEvents() {
  118. mShowBtn.setOnClickListener(new View.OnClickListener() {
  119. @Override
  120. public void onClick(View v) {
  121. String showResult = "";
  122. //循环获取json数据
  123. for(int i = 0;i<jsonDataList.size();i++){
  124. ParseDataModel model = jsonDataList.get(i);
  125. int code = model.getCode();
  126. Object data = model.getData();
  127. String dataType = "Object";
  128. if(data instanceof Integer){
  129. data = (Integer)data;
  130. dataType = "Integer";
  131. }else if(data instanceof String){
  132. data = (String)data;
  133. dataType = "String";
  134. }else if(data instanceof JSONObject){
  135. data = (JSONObject)data;
  136. dataType = "JSONObject";
  137. }
  138. showResult += "code=" + code + ";data=" + data + "【dataType=" + dataType + "】\n";
  139. }
  140. mShowTv.setText(showResult);
  141. }
  142. });
  143. }
  144.  
  145. /**
  146. * 访问assets目录下的资源文件,获取文件中的字符串
  147. * @param assetsFilePath - 文件的相对路径,例如:"listitemdata.txt或者"/why/listdata.txt"
  148. * @return 内容字符串
  149. * */
  150. public static String getStringFromAssert(Context mContext, String assetsFilePath) {
  151.  
  152. String content = ""; // 结果字符串
  153. try {
  154. InputStream is = mContext.getResources().getAssets().open(assetsFilePath);// 打开文件
  155. int ch = 0;
  156. ByteArrayOutputStream out = new ByteArrayOutputStream(); // 实现了一个输出流
  157. while ((ch = is.read()) != -1) {
  158. out.write(ch); // 将指定的字节写入此 byte 数组输出流
  159. }
  160. byte[] buff = out.toByteArray();// 以 byte 数组的形式返回此输出流的当前内容
  161. out.close(); // 关闭流
  162. is.close(); // 关闭流
  163. content = new String(buff, "UTF-8"); // 设置字符串编码
  164. } catch (Exception e) {
  165. Toast.makeText(mContext, "对不起,没有找到指定文件!", Toast.LENGTH_SHORT)
  166. .show();
  167. }
  168. return content;
  169. }
  170. }

效果图

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. [leetcode]22. Generate Parentheses生成括号

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  2. 微软Office Online服务安装部署(三)

    现在开始配置两台服务器,两台服务器的IP: Server: 10.1.3.89 Client:  10.1.3.92 1.在Client中,.打开网络属性,找到ipv4的配置,将dns 改成域控制器的 ...

  3. 代码之髓读后感——类&继承

    面向对象 语言中的用语并不是共通的,在不同语言中,同一个用语的含义可能会有很大差别. C++的设计者本贾尼·斯特劳斯特卢普对类和继承给予了正面肯定,然而,"面向对象"这个词的发明者 ...

  4. HDU2028

    #include <bits/stdc++.h> using namespace std; ; int gcd(int a, int b) { ? b:gcd(b, a%b); } int ...

  5. Linux module 添加到bashrc 和临时ifort编译器 以及python2和3的配置

    第一步vim ~/.bashrc按键盘的i然后source /home/export/online1/bjpara/para/modules/scripts/cn-module.sh最后:x! bas ...

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

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

  7. 利用iptables防止ssh暴力破解和控制网速

    iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --setiptables -I INPUT -p ...

  8. 图解HTTP第五章

    与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1>用单台虚拟主机实现多个域名 HTTP/1.1 规范 ...

  9. C#Dictionary源码

     Dictionary Dictionary与hashtable的区别:dictionary支持泛型. 通常处理哈希冲突的方法有:开放地址法,再哈希法,链地址法,建立一个公共栈区等. 在哈希表上进行查 ...

  10. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十八之铭文升级版

    铭文一级: 功能二:功能一+从搜索引擎引流过来的 HBase表设计create 'imooc_course_search_clickcount','info'rowkey设计:也是根据我们的业务需求来 ...