【史上最简单】头条项目中使用到的json解析
来源:互联网 发布:dede淘宝客api采集 编辑:程序博客网 时间:2024/06/06 01:58
在项目使用到json解析网址返回的json格式数据,我的网络访问使用的是retrofit2.0框架,它里面自带了json转换成object转换器,当然,可以自己自定义转换器。
其实,转换器也是基于最基础json的string文本来不断的解析转换,封装而成的,所以我们最好搞懂最基础的转换方法。
我的数据是聚合数据:
https://www.juhe.cn/box/index/id/235
比如:
{ "reason":"成功的返回", "result":{ "stat":"1", "data":[ { "uniquekey":"9acb533ba0f54242743fa9128a4d6ab3", "title":"不惧怕任何国家!中国进行国土防御作战完全没有压力!", "date":"2017-05-26 16:30", "category":"军事", "author_name":"军刀", "url":"http:\/\/mini.eastday.com\/mobile\/170526163040904.html", "thumbnail_pic_s":"http:\/\/08.imgmini.eastday.com\/mobile\/20170526\/20170526163040_8c883638d210ad10b70cd17679f2f3b3_2_mwpm_03200403.jpeg", "thumbnail_pic_s02":"http:\/\/08.imgmini.eastday.com\/mobile\/20170526\/20170526163040_8c883638d210ad10b70cd17679f2f3b3_3_mwpm_03200403.jpeg", "thumbnail_pic_s03":"http:\/\/08.imgmini.eastday.com\/mobile\/20170526\/20170526163040_8c883638d210ad10b70cd17679f2f3b3_4_mwpm_03200403.jpeg" }, { "uniquekey":"9dfb9216a9767ed36665f778eb2cdfb2", "title":"同方威视华沙公司喜获波兰最具活力中小型企业奖", "date":"2017-05-26 16:20", "category":"军事", "author_name":"中国网", "url":"http:\/\/mini.eastday.com\/mobile\/170526162000174.html", "thumbnail_pic_s":"http:\/\/06.imgmini.eastday.com\/mobile\/20170526\/20170526162000_d100909589f10e7972b6715a43a0a66a_1_mwpm_03200403.jpeg" }, { "uniquekey":"30a6ccf5ec03c3166b737b25f369457a", "title":"普京手下两大“海军”浩浩荡荡奔赴战场 海军携带的这只猫很不简单", "date":"2017-05-26 16:16", "category":"军事", "author_name":"军情图解", "url":"http:\/\/mini.eastday.com\/mobile\/170526161634427.html", "thumbnail_pic_s":"http:\/\/07.imgmini.eastday.com\/mobile\/20170526\/20170526161634_233fd32f75522e6f80b6eee7cbba6ad0_3_mwpm_03200403.jpeg", "thumbnail_pic_s02":"http:\/\/07.imgmini.eastday.com\/mobile\/20170526\/20170526161634_233fd32f75522e6f80b6eee7cbba6ad0_4_mwpm_03200403.jpeg", "thumbnail_pic_s03":"http:\/\/07.imgmini.eastday.com\/mobile\/20170526\/20170526161634_233fd32f75522e6f80b6eee7cbba6ad0_2_mwpm_03200403.jpeg" } ] }, "error_code":0}
通常返回的json格式和这个类型,复杂一点的无非各种嵌套出来的。。。
我们要做的就是一层一层解析再转换。
我的代码访问使用了retrofit:
{ Log.d("lihui", "List<Data> list---" + list); //1 Retrofit retrofit = new Retrofit.Builder(). baseUrl("http://v.juhe.cn/"). addConverterFactory(GsonConverterFactory.create()).build(); //2 HttpService myService = retrofit.create(HttpService.class); //3 retrofit.Call<ResponseBody> call = myService.getData(type, "9f3097f4cbe47e8abb01ca3b92e49cda"); //4 call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Response<ResponseBody> response, Retrofit retrofit) { Log.d("lihui", "123onResponse"); try { ResponseBody httpResult = response.body(); //原始数据下手 String result = httpResult.string(); org.json.JSONObject jsonObject = new org.json.JSONObject(result); String reason = jsonObject.getString("reason"); ToastUtils.setToastText(context, reason); String result2 = jsonObject.getString("result"); org.json.JSONObject jsonObject2 = new org.json.JSONObject(result2); String stat = jsonObject2.getString("stat"); String data = jsonObject2.getString("data"); org.json.JSONArray jsonArray2 = new org.json.JSONArray(data); list.clear(); for (int i = 0; i < jsonArray2.length(); i++) { //获取每一个JsonObject对象 org.json.JSONObject myjObject = jsonArray2.getJSONObject(i); if (myjObject != null) { Data data1 = new Data(myjObject); Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey()); Log.d("lihui", "Fragment onResponse data---" + data1); list.add(data1); } } if (list != null && list.size() > 0 && mHandler != null) { Message msg = mHandler.obtainMessage(); msg.what = 0; msg.obj = list; mHandler.sendMessage(msg); empty.setVisibility(View.GONE); cacheMap.put(type, list); } Log.d("lihui", "159 list---" + list); } catch (Exception e) { Log.d("lihui", "114e---" + e.getMessage()); pullToRefreshRecyclerView.onRefreshComplete(); } } @Override public void onFailure(Throwable t) { Log.d("lihui", "165t:" + t.getMessage()); t.printStackTrace(); Message msg = mHandler.obtainMessage(); msg.what = 1; msg.obj = type; mHandler.sendMessage(msg); } }); return list; }
1、拿到最原始数据,服务器直接返回的 { xxxxx }
转换成一个jsonObject
org.json.JSONObject:这个是api自带的 org.json.JSONObject jsonObject = new org.json.JSONObject(result);
2、拿到第二层对象result2 ,转换成jsonObject。
String reason = jsonObject.getString("reason"); ToastUtils.setToastText(context, reason); String result2 = jsonObject.getString("result"); org.json.JSONObject jsonObject2 = new org.json.JSONObject(result2);
3、继续拿第三层data,也是一个子对象。
这个对象可以看成是一个数组对象,jsonArray2 里面有多个元素!!!
String stat = jsonObject2.getString("stat"); String data = jsonObject2.getString("data"); org.json.JSONArray jsonArray2 = new org.json.JSONArray(data);
4、第四层,数组里面每个元素也是一个jsonobject对象。拿出来
org.json.JSONObject myjObject = jsonArray2.getJSONObject(i);
for (int i = 0; i < jsonArray2.length(); i++) { //获取每一个JsonObject对象 org.json.JSONObject myjObject = jsonArray2.getJSONObject(i); if (myjObject != null) { Data data1 = new Data(myjObject); Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey()); Log.d("lihui", "Fragment onResponse data---" + data1); list.add(data1); } }
好了,学会这个json格式的解析,应该没有什么可以难倒我们了吧,一层一层解析,这里最主要的方法如下:
org.json.JSONObject :这个类,sdk自带jsonObject.getString("reason");org.json.JSONArray jsonArray2 = new org.json.JSONArray(data);循环: for (int i = 0; i < jsonArray2.length(); i++) { //获取每一个JsonObject对象 org.json.JSONObject myjObject = jsonArray2.getJSONObject(i); if (myjObject != null) { Data data1 = new Data(myjObject); Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey()); Log.d("lihui", "Fragment onResponse data---" + data1); list.add(data1); } }
最后咱们拿到这个jsonobject对象,就可以自己自定义object了,构造初始化:
public Data(JSONObject jsonObject) throws Exception{ this.title=jsonObject.getString("title"); this.date=jsonObject.getString("date"); this.author_name=jsonObject.getString("author_name"); this.thumbnail_pic_s=jsonObject.getString("thumbnail_pic_s"); //this.thumbnail_pic_s02=jsonObject.getString("thumbnail_pic_s02"); //this.thumbnail_pic_s03=jsonObject.getString("thumbnail_pic_s03"); this.url=jsonObject.getString("url"); // this.uniquekey=jsonObject.getString("uniquekey"); }
结束~~~~~~~~~~~·
阅读全文
0 0
- 【史上最简单】头条项目中使用到的json解析
- [javaEE]Java中JSON的简单使用与前端解析
- Github项目解析(十三)-->使用Kotlin实现UC头条ViewPager左右滑动效果
- 头条信息3秒切换以及json解析数组
- 项目中使用到的封装---后台子线程执行任务,前台显示加载条
- 怎么解析Json数据,然后把解析到的Json数据填充到布局中?
- ajax中使用JSON的方法解析
- json解析到listview项目实例
- 今日头条项目
- 头条项目总结
- Android中最简单的解析Json的方法
- 使用Gson解析json到任意类型的Bean
- android中 json 到 object 及 object 到 json 的解析
- Rapidjson的简单使用(拼接json串,存取文件中的json,解析json串)
- Rapidjson的简单使用(拼接json串,存取文件中的json,解析json串)
- json数据解析<一> JSONObject和JSONArray的简单使用
- Android 仿今日头条的视频播放控件(使用开源库灰常简单)
- Android中使用GSON包解析JSON数据(简单JSON)
- Spring整合jdbcTemplate模板报错
- gc机制--垃圾检测、回收算法
- 第三周(2)——微信被动服务部分
- Hessian入门(传递集合,对象)
- jquery自动点击按钮
- 【史上最简单】头条项目中使用到的json解析
- 动态规划简单例子(数塔问题)java
- jvm调优总结(从基本概念 到 深度优化)
- spring-HelloWorld
- 完整iOS项目
- Rex::Commands
- SpringMVC 返回数据(持续更新)
- gift1-section1.1
- 直观感受SetEase------渐变曲线