格式

  1. {"name":"zhangsan", "age":18, "books":[{"name":"金瓶","price":10}, {"name":"红楼梦","price":20}]}


解析
1.JSONObject
 
  1. [{"id":"5","version":"5.5","name":"Angry Birds"},
  2. {"id":"6","version":"7.0","name":"Clash of Clans"},
  3. {"id":"7","version":"3.5","name":"Hey Day"}]
  1. private void parseJSONWithJSONObject(String jsonData) {
  2. try {
  3. JSONArray jsonArray = new JSONArray(jsonData);
  4. for (int i = 0; i < jsonArray.length(); i++) {
  5. JSONObject jsonObject = jsonArray.getJSONObject(i);
  6. String id = jsonObject.getString("id");
  7. String name = jsonObject.getString("name");
  8. String version = jsonObject.getString("version");
  9. Log.d("MainActivity", "id is " + id);
  10. Log.d("MainActivity", "name is " + name);
  11. Log.d("MainActivity", "version is " + version);
  12. }
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. }
由于我们在服务器中定义的是一个 JSON数组,因此这里首先是将服务器返回的数据传入到了一个 JSONArray对象中。然后循环遍历这个 JSONArray,从中取出的每一个元素都是一个 JSONObject 对象,每个 JSONObject 对象中又会包含 id、name 和version这些数据。接下来只需要调用 getString()方法将这些数据取出,并打印出来即可。
2.Gson 
google + json

谷歌提供的开源的解析json的框架

Gson gson = new Gson();

NewsData data = gson.fromJson(result, NewsData.class);
1、需要一个分装JSON数据的分装类,也可以写set、get方法。不过这里解析完就给各个属性赋值了
首先的大括号一般不用管。遇到[]是需要定义个list,里面存放着对象;遇到{},说明里面是对象,那么就需要写个对象。本例中在data里的第0个,里面又一个children[],说明又需要个list,然后根据对象里的字段名字写个children里面的对象。对象的名字和list的名字如果看网络数据来决定是否需要和网络上的一致,如果[前有名字,那么list的名字就是这个,如果{有名字,对象里有对象,这样写:
  1. public int retcode;
  2. public PhotosInfo data;
  3. public class PhotosInfo {
  4. public String title;
  5. public ArrayList<PhotoInfo> news;
  6. }

  1. /**
  2. * 网络分类信息的封装
  3. *
  4. * 字段名字必须和服务器返回的字段名一致, 方便gson解析
  5. */
  6. public class NewsData {
  7. public int retcode;
  8. public ArrayList<NewsMenuData> data;
  9. // 侧边栏数据对象
  10. public class NewsMenuData {
  11. public String id;
  12. public String title;
  13. public int type;
  14. public String url;
  15. public ArrayList<NewsTabData> children;
  16. @Override
  17. public String toString() {
  18. return "NewsMenuData [title=" + title + ", children=" + children
  19. + "]";
  20. }
  21. }
  22. // 新闻页面下11个子页签的数据对象
  23. public class NewsTabData {
  24. public String id;
  25. public String title;
  26. public int type;
  27. public String url;
  28. @Override
  29. public String toString() {
  30. return "NewsTabData [title=" + title + "]";
  31. }
  32. }
  33. @Override
  34. public String toString() {
  35. return "NewsData [data=" + data + "]";
  36. }
  37. }
2、定义一个全局参量
  1. public class GlobalContants {
  2. public static final String SERVER_URL = "http://10.0.2.2:8080/zhbj";
  3. // 获取分类信息的接口
  4. public static final String CATEGORIES_URL = SERVER_URL + "/categories.json";
  5. }
3.在新闻中pager中,使用gson解析数据
  1. public class NewsCenterPager extends BasePager {
  2. //只要需要往一个容器添加很多页面,就需要一个arraylist
  3. private ArrayList<BaseMenuDetailPager> mPagers;// 4个菜单详情页的集合
  4. private NewsData mNewsData;
  5. public NewsCenterPager(Activity activity) {
  6. super(activity);
  7. }
  8. @Override
  9. public void initData() {
  10. System.out.println("初始化新闻中心数据....");
  11. tvTitle.setText("新闻");
  12. setSlidingMenuEnable(true);// 打开侧边栏
  13. getDataFromServer();
  14. }
  15. /**
  16. * 从服务器获取数据
  17. */
  18. private void getDataFromServer() {
  19. HttpUtils utils = new HttpUtils();
  20. // 使用xutils发送请求
  21. utils.send(HttpMethod.GET, GlobalContants.CATEGORIES_URL,
  22. new RequestCallBack<String>() {
  23. // 访问成功
  24. @Override
  25. public void onSuccess(ResponseInfo responseInfo) {
  26. String result = (String) responseInfo.result;
  27. System.out.println("返回结果:" + result);
  28. parseData(result);
  29. }
  30. // 访问失败
  31. @Override
  32. public void onFailure(HttpException error, String msg) {
  33. Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
  34. .show();
  35. error.printStackTrace();
  36. }
  37. });
  38. }
  39. /**
  40. * 解析网络数据
  41. *
  42. * @param result
  43. */
  44. protected void parseData(String result) {
  45. Gson gson = new Gson();
  46. mNewsData = gson.fromJson(result, NewsData.class);
  47. System.out.println("解析结果:" + mNewsData);
  48. // 刷新测边栏的数据
  49. MainActivity mainUi = (MainActivity) mActivity;
  50. LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();//获取侧边栏对象
  51. leftMenuFragment.setMenuData(mNewsData);//侧边的方法,使用侧边栏展示数据
  52. // 准备4个菜单详情页
  53. mPagers = new ArrayList<BaseMenuDetailPager>();
  54. mPagers.add(new NewsMenuDetailPager(mActivity,
  55. mNewsData.data.get(0).children));
  56. mPagers.add(new TopicMenuDetailPager(mActivity));
  57. mPagers.add(new PhotoMenuDetailPager(mActivity));
  58. mPagers.add(new InteractMenuDetailPager(mActivity));
  59. setCurrentMenuDetailPager(0);// 设置菜单详情页-新闻为默认当前页
  60. }
  61. /**
  62. * 设置当前菜单详情页
  63. */
  64. public void setCurrentMenuDetailPager(int position) {
  65. BaseMenuDetailPager pager = mPagers.get(position);// 获取当前要显示的菜单详情页
  66. flContent.removeAllViews();// 清除之前的布局
  67. flContent.addView(pager.mRootView);// 将菜单详情页的布局设置给帧布局
  68. // 设置当前页的标题
  69. NewsMenuData menuData = mNewsData.data.get(position);//获取mNewsData下数据的第几个页面
  70. tvTitle.setText(menuData.title);
  71. pager.initData();// 初始化当前页面的数据
  72. }
  73. }
其中NewsMenuDetailPager:
  1. public class NewsMenuDetailPager extends BaseMenuDetailPager{
  2. private ArrayList<NewsTabData> mNewsTabData;// 页签网络数据
  3. public NewsMenuDetailPager(Activity activity,
  4. ArrayList<NewsTabData> children) {
  5. super(activity);
  6. mNewsTabData = children;
  7. }
  8. @Override
  9. public View initViews() {
  10. return null;
  11. }
  12. }

其中菜单详情页基类:
因为和主页面里的哪个basepager不一样了,所以需要重新写个

  1. public abstract class BaseMenuDetailPager {
  2. public Activity mActivity;
  3. public View mRootView;// 根布局对象
  4. public BaseMenuDetailPager(Activity activity) {
  5. mActivity = activity;
  6. mRootView = initViews();
  7. }
  8. /**
  9. * 初始化界面
  10. */
  11. public abstract View initViews();
  12. /**
  13. * 初始化数据
  14. */
  15. public void initData() {
  16. }
  17. }





4.json解析的更多相关文章

  1. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  2. Json解析工具的选择

    前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson ...

  3. iOS json 解析遇到error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed.

    Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 38 ...

  4. Android之JSON解析

    做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...

  5. Android总结之json解析(FastJson Gson 对比)

    前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...

  6. JSON解析和XML解析对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...

  7. iOS json解析的几种方法 NSJSONSerialization,JSONKit,SBJson ,TouchJson

    相关的第三方类库大家可以去github上下载 1.NSJSONSerialization 具体代码如下 : - (void)viewDidLoad { [super viewDidLoad]; NSD ...

  8. Json解析工具Jackson(使用注解)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...

  9. Json解析工具Jackson(简单应用)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 概述 Jackson库(http://jackson.codehaus.org),是 ...

  10. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

随机推荐

  1. MySQL的or/in/union与索引优化

    转载自:MySQL的or/in/union与索引优化 https://blog.csdn.net/zhangweiwei2020/article/details/80005590 假设订单业务表结构为 ...

  2. 可以作为瘟到死(windows)路径的字符

    !#$%&""()+-0123456789;=@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[]^_`{}~

  3. SQL Server 磁盘请求超时的833错误原因分析以及解决

    本文出处:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的erro ...

  4. flume知识点总结

    首先介绍一下在flume中常用的一个数据格式,以及使用该格式的优缺点:  从flume写数据到hdfs中的时候,使用二进制格式相对于使用纯文本来说是一种更好的选择,因为大多数二进制格式都有一些方法指明 ...

  5. Linux 下监控用户最大进程数参数(nproc)是否到达上限的步骤:

    https://www.cnblogs.com/autopenguin/p/6184886.html 1.查看各系统用户的进程(LWP)数: 注意:默认情况下采用 ps 命令并不能显示出所有的进程.因 ...

  6. 新建jsp项目

    选择 下面类型

  7. 浅谈js抽象工厂模式

    一.简单工厂 定义:简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 比如你去专门卖鼠标的地方你可以买各种各样的 ...

  8. ES6 的面向对象

    JavaScript 语言中,生成实例对象的传统方法是通过构造函数. function Animal(name, age) { this.name = name; this.age = age; } ...

  9. 完全理解 Python 迭代对象、迭代器、生成器

    完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun    本文源自RQ作者 ...

  10. CentOS 6.x下wget 下载提示 Unable to locally verify the issuer’s authority 完美解决方案

    CentOS 6.x下wget 下载提示 Unable to locally verify the issuer’s authority 完美解决方案 栏目:Linux 作者:小天 点击: 1,453 ...