13.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()方法将这些数据取出,并打印出来即可。

	private void json() {		try {			// 将json文件读取到buffer数组中			InputStream is = this.getResources().openRawResource(R.raw.json);			byte[] buffer = new byte[is.available()];			is.read(buffer);			// 将字节数组转换为以GB2312编码的字符串			String json = new String(buffer, "GB2312");			// 将字符串json转换为json对象,以便于取出数据			JSONObject jsonObject = new JSONObject(json);			// 解析info数组,解析中括号括起来的内容就表示一个数组,使用JSONArray对象解析			JSONArray array = jsonObject.getJSONArray("info");			// StringBuffer操作字符串的一个高效类,保存解析的结果,以便于在TextView中显示			StringBuffer strBuf = new StringBuffer();			// 遍历JSONArray数组			for (int i = 0; i < array.length(); i++) {				// 取出数组的第一项				JSONObject item = array.getJSONObject(i);				// 获得名称为title项的值				String title = item.getString("title");				String content = item.getString("content");				int duration = item.getInt("duration");				// 大括号括起来的内容就表示一个JSONObject,所以这里要再创建一个JSONObject对象				JSONObject pics = item.getJSONObject("pics");				String pic1 = pics.getString("pic1");				JSONObject music = item.getJSONObject("music");				String msc1 = music.getString("msc1");				// 结果放入StringBuffer				strBuf.append("title:" + title + "\n");				strBuf.append("content:" + content + "\n");				strBuf.append("duration:" + duration + "\n");				strBuf.append("pics:" + "\n");				strBuf.append(" pic1:" + pic1 + "\n");				strBuf.append("music:" + "\n");				strBuf.append("msc1:" + msc1 + "\n");			}			// textView中显示结果			textView.setText(strBuf);		} catch (Exception e) {			textView.setText(e.getMessage());		}		// 这个是我写的测试代码,在我的设备上运行已经没有问题		// 注意一下你的json格式,必须是大括号开头,所以我添了大括号,并且在前面加了一个“info”头		// 有什么问题可以追问

我的总结:

  • 首先遇到{对象new jsinobj,遇到〔〕 new jsonarray
  • 是{,new jsonobj,遇到[obj.array,遇到array就要遍历,在for里面,obj=arry.obj,obj.getstring。
  • 如果是这样(对象里包括对象)

{[

{},{}

]{},那么obj=obj.obj,obj.getstring

  • 如果是这样(对象里包括数组:遍历)

{[

{}

{[

{}

]},那么还需要遍历,obj.getarry,继续遍历,在循环中array.obj,obj.getstring


2.Gson  google + json 谷歌提供的开源的解析json的框架 Gson gson = new Gson(); NewsData data = gson.fromJson(result, NewsData.class);

1、需要一个分装JSON数据的分装类,可不set、get,后边有讲

/** * 网络分类信息的封装 *  * 字段名字必须和服务器返回的字段名一致, 方便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();// 初始化当前页面的数据	}}

其中菜单详情页基类:

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 条评论
登录 后参与评论

相关文章

  • logstash配置codec插件-JSON模式

    配置nginx日志 log_format json '{"remote_addr":"$remote_addr" ,"host":"$host" ,"serve...

    苦咖啡
  • python3爬取网易云音乐歌单里的歌词(含源码)

    一些注意事项: 1.看了Coursera上面的python教程,里面给了一个非常简单的示例,只传一个url就获取到响应报文。然而很多网站是不能只通过一个url就...

    kalifa_lau
  • 异步记录PHP日志

    1, 'message' => '请求成功'); echo json_encode($result); $message = '这是变量内容'; //投递日志...

    苦咖啡
  • 爬虫篇(4)——qq音乐文件的爬取

    前言:qq音乐文件的批量爬取,涉及到的json对网站的解析,请求的有效伪装,字符串的操作等。 目的:爬取想要的音乐资源,包括需要付费下载的音乐。 流程 包括...

    DC童生
  • geotrellis使用(十九)spray-json框架介绍

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 spr...

    魏守峰
  • 走进webpack(3)-- 小结

      写这一系列的文章,本意是想要梳理一下自己凌乱的webpack知识,只是使用过vue-cli,修改过其中的一部分代码,但是对于一个简单项目从0开始搭建webp...

    zaking
  • SpringBoot返回json和xml

    有些情况接口需要返回的是xml数据,在springboot中并不需要每次都转换一下数据格式,只需做一些微调整即可。 新建一个springboot项目,加入依赖j...

    dalaoyang
  • 使用C#将json字符串作为对象存入MongoDB

          今天刚好在工作中碰到一个小问题,并愉快的解决了,权当将其记录下来,供人查阅,首先声明本人是个忠实的微软技术爱好者,主要使用的也是.NET语言。下面进...

    魏守峰
  • Gulp学习笔记 【原创】

    Gulp学习笔记 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csx...

    CS逍遥剑仙
  • day5-json和pickle序列化

    一.json模块 序列化:把一个对象的形态改变一下,使他能够存放在文件中,或者在网络上传输,序列化也叫持久化,是把对象存储到永久介质中,这样就不会因为掉电而丢失...

    用户1679793

扫码关注云+社区

领取腾讯云代金券