4.json解析

格式

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

解析

1.JSONObject

[{"id":"5","version":"5.5","name":"Angry Birds"},{"id":"6","version":"7.0","name":"Clash of Clans"},{"id":"7","version":"3.5","name":"Hey Day"}]
   private void parseJSONWithJSONObject(String jsonData) {        try {            JSONArray jsonArray = new JSONArray(jsonData);            for (int i = 0; i < jsonArray.length(); i++) {                JSONObject jsonObject = jsonArray.getJSONObject(i);                String id = jsonObject.getString("id");                String name = jsonObject.getString("name");                String version = jsonObject.getString("version");                Log.d("MainActivity", "id is " + id);                Log.d("MainActivity", "name is " + name);                Log.d("MainActivity", "version is " + version);            }        } catch (Exception e) {            e.printStackTrace();        }    }  

由于我们在服务器中定义的是一个 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的名字就是这个,如果{有名字,对象里有对象,这样写:

    public int retcode;	public PhotosInfo data;	public class PhotosInfo {		public String title;		public ArrayList<PhotoInfo> news;	}
/** * 网络分类信息的封装 *  * 字段名字必须和服务器返回的字段名一致, 方便gson解析 */public class NewsData {	public int retcode;	public ArrayList<NewsMenuData> data;	// 侧边栏数据对象	public class NewsMenuData {		public String id;		public String title;		public int type;		public String url;		public ArrayList<NewsTabData> children;		@Override		public String toString() {			return "NewsMenuData [title=" + title + ", children=" + children					+ "]";		}	}	// 新闻页面下11个子页签的数据对象	public class NewsTabData {		public String id;		public String title;		public int type;		public String url;		@Override		public String toString() {			return "NewsTabData [title=" + title + "]";		}	}	@Override	public String toString() {		return "NewsData [data=" + data + "]";	}}

2、定义一个全局参量

public class GlobalContants {	public static final String SERVER_URL = "http://10.0.2.2:8080/zhbj";   // 获取分类信息的接口	public static final String CATEGORIES_URL = SERVER_URL + "/categories.json";}

3.在新闻中pager中,使用gson解析数据

public class NewsCenterPager extends BasePager {//只要需要往一个容器添加很多页面,就需要一个arraylist	private ArrayList<BaseMenuDetailPager> mPagers;// 4个菜单详情页的集合	private NewsData mNewsData;	public NewsCenterPager(Activity activity) {		super(activity);	}	@Override	public void initData() {		System.out.println("初始化新闻中心数据....");		tvTitle.setText("新闻");		setSlidingMenuEnable(true);// 打开侧边栏		getDataFromServer();	}	/**	 * 从服务器获取数据	 */	private void getDataFromServer() {		HttpUtils utils = new HttpUtils();		// 使用xutils发送请求		utils.send(HttpMethod.GET, GlobalContants.CATEGORIES_URL,				new RequestCallBack<String>() {					// 访问成功					@Override					public void onSuccess(ResponseInfo responseInfo) {						String result = (String) responseInfo.result;						System.out.println("返回结果:" + result);						parseData(result);					}					// 访问失败					@Override					public void onFailure(HttpException error, String msg) {						Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)								.show();						error.printStackTrace();					}				});	}	/**	 * 解析网络数据	 * 	 * @param result	 */	protected void parseData(String result) {		Gson gson = new Gson();		mNewsData = gson.fromJson(result, NewsData.class);		System.out.println("解析结果:" + mNewsData);		// 刷新测边栏的数据		MainActivity mainUi = (MainActivity) mActivity;		LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();//获取侧边栏对象		leftMenuFragment.setMenuData(mNewsData);//侧边的方法,使用侧边栏展示数据		// 准备4个菜单详情页		mPagers = new ArrayList<BaseMenuDetailPager>();		mPagers.add(new NewsMenuDetailPager(mActivity,				mNewsData.data.get(0).children));		mPagers.add(new TopicMenuDetailPager(mActivity));		mPagers.add(new PhotoMenuDetailPager(mActivity));		mPagers.add(new InteractMenuDetailPager(mActivity));		setCurrentMenuDetailPager(0);// 设置菜单详情页-新闻为默认当前页	}	/**	 * 设置当前菜单详情页	 */	public void setCurrentMenuDetailPager(int position) {		BaseMenuDetailPager pager = mPagers.get(position);// 获取当前要显示的菜单详情页		flContent.removeAllViews();// 清除之前的布局		flContent.addView(pager.mRootView);// 将菜单详情页的布局设置给帧布局		// 设置当前页的标题		NewsMenuData menuData = mNewsData.data.get(position);//获取mNewsData下数据的第几个页面		tvTitle.setText(menuData.title);		pager.initData();// 初始化当前页面的数据	}}

其中NewsMenuDetailPager:

public class NewsMenuDetailPager extends BaseMenuDetailPager{	private ArrayList<NewsTabData> mNewsTabData;// 页签网络数据	public NewsMenuDetailPager(Activity activity,			ArrayList<NewsTabData> children) {		super(activity);		mNewsTabData = children;	}	@Override	public View initViews() {		return null;	}}

其中菜单详情页基类:

因为和主页面里的哪个basepager不一样了,所以需要重新写个

public abstract class BaseMenuDetailPager {	public Activity mActivity;	public View mRootView;// 根布局对象	public BaseMenuDetailPager(Activity activity) {		mActivity = activity;		mRootView = initViews();	}	/**	 * 初始化界面	 */	public abstract View initViews();	/**	 * 初始化数据	 */	public void initData() {	}}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android-薛之涛

Android - 懒加载

如果我们的项目中使用了ViewPager+Framgment实现底部Tab可点可滑,那么我们都知道ViewPager有预加载功能,通过viewpager.set...

24620
来自专栏GIS讲堂

安卓中的数据存取

在我们每天使用的手机设备中,无时无刻都在进行着数据的存和取。安卓作为一种手机操作系统,提供了如下方式的数据存取方式:Preference,File,Sqlite...

13520
来自专栏Android学习之路

Dagger2使用攻略-基础部分

在这篇文章中,我会介绍 什么是依赖注入,Dagger2是什么,解决什么问题以及基础注解的使用

25840
来自专栏Android干货园

Android谈谈封装那些事--BaseActivity和BaseFragment(一)

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/53...

76730
来自专栏刘望舒

RxBinding使用和源码解析

作者 | juexingzhe 地址 | https://www.jianshu.com/u/ea71bb3770b4 声明 | 本文是 juexingzhe...

466100
来自专栏緣來來來

安卓基础干货(五):安卓线程与数据上传下载的学习

7610
来自专栏jianhuicode

如何使用MVP+Dagger2+RxJava+Retrofit开发(1)

概述 在2016年5,6月份开始在知乎上看到开发方法,那时候记得是看mvc,mvp,mvvm这三种开发模式区别,后面进一步了解到google在github上开源...

52880
来自专栏小鄧子的技术博客专栏

【译】Android泄漏模式:View中的订阅

我们通过一些自定义的view来构建Square register模块。有时候这些view需要监听一个比他们自身声明周期还要长的对象。

8510
来自专栏KK的小酒馆

APP启动引导页的制作,用ViewPager实现翻页动画

这次制作App的引导页,主要用到2个知识“SharedPreferences 和 ViewPager”

49710
来自专栏潇涧技术专栏

Android Dependency Injection Libraries

本文总结并对比了三种Android依赖注入库:Butter Knife、RoboGuice、Android Annotations的使用

9410

扫码关注云+社区

领取腾讯云代金券