格式
{"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”头 // 有什么问题可以追问
我的总结:
{[
{},{}
]{},那么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() { }}