具体处理思路以及使用到的知识点:

1.使用android的异步处理

2.将要使用的功能(方法)进行封装,以便主类进行调用

3.前台展示要使用适配器模型(这里使用简单适配器(SimpleAdapter))

主类的代码:

package com.example.lenovo.asynctask_json;import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.example.lenovo.asynctask_json.domin.NetUtils;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
/*** {}代表 json对象* []:代表时json 数组** {key:value,key:value,key:value.....}** {*  name:"张三",**  age:20,**  tel:[111,222,333,444],**  loves:[*      {ball:"球"},*      {game:"游戏"}**  ]**  }*/
public class MainActivity extends AppCompatActivity {private ListView listView_movie;private SimpleAdapter adapter;private List<Map<String,Object>> list;//private String  path="http://lib.wap.zol.com.cn/ipj/docList.php?class_id=0&page=1&vs=and380&retina=1@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.listView_movie= (ListView) this.findViewById(R.id.listView_movie);String  path= null;try {//URLEncoder.encode("热门","utf-8"):将汉字进行Unicode编码path = "https://movie.douban.com/j/search_subjects?type=movie&tag="+ URLEncoder.encode("热门","utf-8")+"&sort=recommend&page_limit=20&page_start=21";} catch (UnsupportedEncodingException e) {e.printStackTrace();}new NetDownLoadAsyncTask().execute(path);}private final class NetDownLoadAsyncTask extends AsyncTask<String,Void,List<Map<String,Object>>>{@Overrideprotected List<Map<String, Object>> doInBackground(String... params) {//调用NetUtils类的方法,将网址对应的数据以InputStream的形式返回.InputStream inputStream=NetUtils.getInputStreamByPath(params[0]);if(inputStream!=null){//调用NetUtils类的方法,将输入流转换成字符串.String json=NetUtils.getStringByInputStream(inputStream);System.out.println("json="+json);if(json!=null){//调用NetUtils类的方法,对json对象进行处理list= NetUtils.getListMapByJsonString(json);return list;}}return null;}@Overrideprotected void onPostExecute(List<Map<String, Object>> maps) {if(maps!=null){System.out.println("maps="+maps);adapter=new SimpleAdapter(MainActivity.this,//上下文对象maps,//数据源R.layout.movie_item,//前台要展示的,这里是(自己定义到格式)对应点击条目的样式new String[]{"title","cover"},//键值"title"与"cover"new int[]{R.id.textView_title,R.id.imageView_cover}//控件对应id的int型数组){/*** 当每绘制一条条目对象时自动调用的方法* @param position* @param convertView* @param parent* @return*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//System.out.println("===getView(int position="+position+", View convertView="+convertView+", ViewGroup parent="+parent+")===");//得到当前绘制的条目对象View view=super.getView(position, convertView, parent);//System.out.println("view="+view);ImageView imageView_cover= (ImageView) view.findViewById(R.id.imageView_cover);Map<String,Object> map=list.get(position);Bitmap bitmap= (Bitmap) map.get("cover");//手工设置imageView对应的bitmap对象imageView_cover.setImageBitmap(bitmap);return view;}};listView_movie.setAdapter(adapter);System.out.println("=======");}else {System.out.println("从网络上获取数据失败!");}}}
}

封装好的代码:

package com.example.lenovo.asynctask_json.domin;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** Created by hsjwcf on 2018/5/29.*/
public class NetUtils {/*** 将给你的网址对应的数据以InputStream的形式返回* @param path* @return*/public static InputStream getInputStreamByPath(String path){try {URL url=new URL(path);HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();httpURLConnection.setConnectTimeout(3000);/*httpURLConnection.getResponseCode()干了两件事:A:根据指定的网址向服务器发送请求并得到服务器的回应B:在回应中包含状态码:200表示访问成功*/int responseCode=httpURLConnection.getResponseCode();if(responseCode==200){//说明本次访问成功//以输入流的形式得到服务器返回的数据InputStream inputStream=httpURLConnection.getInputStream();return inputStream;}} catch (Exception e) {e.printStackTrace();}return null;}/*** 根据输入流得到字节数组* @param inputStream* @return*/public static byte[]  getBytesByInputStream(InputStream inputStream){ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int len=0;try {while ((len=inputStream.read(buffer))!=-1){byteArrayOutputStream.write(buffer,0,len);}return  byteArrayOutputStream.toByteArray();} catch (IOException e) {e.printStackTrace();}return null;}/*** 根据输入流得到字符串* @param inputStream* @return*/public static String getStringByInputStream(InputStream inputStream){ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int len=0;try {while ((len=inputStream.read(buffer))!=-1){byteArrayOutputStream.write(buffer,0,len);}return  byteArrayOutputStream.toString();} catch (IOException e) {e.printStackTrace();}return null;}/*** 通过解析json 字符串得到List<Map<String,Object>>类型的对象*** {"subjects": [{"rate": "8.3","cover_x": 3578,"title": "暴裂无声","url": "https://movie.douban.com/subject/26647117/","playable": true,"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2517333671.jpg","id": "26647117","cover_y": 5078,"is_new": false},{"rate": "7.0","cover_x": 1500,"title": "负重前行","url": "https://movie.douban.com/subject/26793157/","playable": false,"cover": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2518648419.jpg","id": "26793157","cover_y": 2222,"is_new": false}]}* @param json* @return*/public static List<Map<String,Object>> getListMapByJsonString(String json){List<Map<String,Object>> list=new ArrayList<>();try {//1.将json 字符串转换成Json对象JSONObject jsonObject=new JSONObject(json);//2.根据键得到json 数组JSONArray jsonArray=jsonObject.getJSONArray("subjects");//得到数组中元素的个数int len=jsonArray.length();for(int i=0;i<len;i++){Map<String,Object> map=new HashMap<>();jsonObject= jsonArray.getJSONObject(i);String title=jsonObject.getString("title");String cover=jsonObject.getString("cover");System.out.println("cover="+cover);//String cover=jsonArray.getString(0);map.put("title",title);//将数据源中cover 对应的网址转换成Bitmap 对象InputStream inputStream=getInputStreamByPath(cover);byte[] data=getBytesByInputStream(inputStream);Bitmap bitmap=BitmapFactory.decodeByteArray(data,0,data.length);map.put("cover",bitmap);list.add(map);}} catch (JSONException e) {e.printStackTrace();}return list;}
}

前台展示:

<1>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:layout_gravity="center_horizontal"android:id="@+id/imageView_cover"android:layout_width="200dp"android:layout_height="200dp"/><TextViewandroid:layout_gravity="center_horizontal"android:textSize="30sp"android:id="@+id/textView_title"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>

<2>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listView_movie"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>

android 之json对象解析并展示(含json解析源码)相关推荐

  1. 内置对象的API Array数组对象 String字符串对象 json字符串 JSON对象 js作用域及变量预解析 引用类型与值类型区别 共享引用 基本包装类型 数组去重

    01-内置对象的API a.Date对象获取时间 b.Array对象数组加工 c.String对象字符串加工 d.json字符串的语法格式 e.JSON对象的字符串与对象转换应用 02-JS作用域 a ...

  2. android视频缓存框架 [AndroidVideoCache](https://github.com/danikula/AndroidVideoCache) 源码解析与评估

    文章目录 android视频缓存框架 [AndroidVideoCache](https://github.com/danikula/AndroidVideoCache) 源码解析与评估 引言 使用方 ...

  3. Android技术栈(五)HashMap(包括红黑树)与ArrayMap源码解析

    1 总览 本文会对 Android 中常用HashMap(有红黑树)和ArrayMap进行源码解析,其中 HashMap 源码来自 Android Framework API 28 (JDK=1.8) ...

  4. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2 ...

  5. 【Qt 开源音视频框架模块QtAV】03:QTAV主要接口展示以及播放器源码分享

    介绍 QtAV 是一个基于 Qt 和 FFmpeg 的跨平台.高性能多媒体播放框架,能够帮助你轻而易举地编写出一个播放器. [Qt 开源音视频框架模块QtAV]01:介绍.编译以及简单使用 因为网上使 ...

  6. 【Android数据存储】ContentProvider详细介绍(附实例源码)

    1.ContentProvider是什么? ContentProvider--内容提供者.它是一个类,这个类主要是对Android系统中进行共享的数据进行包装,并提供了一组统一的访问接口供其他程序调用 ...

  7. Android AOSP基础(五)不会调试系统源码,还搞什么Android?

    本文首发于微信公众号「刘望舒」 关联系列 Android AOSP基础系列 Android系统启动系列 应用进程启动系列 Android深入四大组件系列 Android深入理解Context系列 An ...

  8. 读取xml文件转成ListT对象的两种方法(附源码)

    读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...

  9. Android 系统(177)---Android消息机制分析:Handler、Looper、MessageQueue源码分析

    Android消息机制分析:Handler.Looper.MessageQueue源码分析 1.前言 关于Handler消息机制的博客实际上是非常多的了. 之前也是看别人的博客过来的,但是过了一段时间 ...

最新文章

  1. html表单颜色选择器,如何在Django管理中使用HTML5颜色选择器
  2. [转] 2016前端开发技术巡礼
  3. CDQ分治嵌套模板:多维偏序问题
  4. 关于程序为什么要代码段,程序段
  5. JAVA使用JDBC连接MySQL数据库
  6. 单链表的增删查改等基本操作C++实现
  7. 将ABAP透明表的定义(元数据)解析出来导入到剪切板(clipboard)里
  8. 计算机网络标准体系,计算机网络标准体系结构实验报告.doc
  9. flutter listview 滚动到底部_??一个高颜值Flutter版WanAndroid客户端
  10. php自动关闭页面代码,自动生成伪静态页面代码(简易版)
  11. C#网络编程(基本概念和操作) - Part.1[转自JimmyZhang博客]
  12. git cherry-pick合并某个commit
  13. 物流项目介绍示范 有用
  14. GoFW|网页加速器
  15. 修复VSAN无法看到的主机磁盘
  16. 2.1 八边形绘制
  17. 苹果Mac电脑中如何将键盘当作鼠标使用?
  18. Jenkins简介与应用
  19. Protobuf3 google protobuf
  20. 计算机制作情景短剧实验总结,校园情景剧 5分钟正能量情景剧剧本三篇 3分钟情景短剧剧本.docx...

热门文章

  1. CAD计算机辅助设计与BIM的区别,3D建模、CAD和BIM三者之间的差异是什么,有什么区别?...
  2. 带收缩因子的PSO优化算法
  3. 计算机网络·“存储-转发”式分组交换网
  4. c语言解决函数变参数问题 va_list
  5. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)
  6. [Redis源码阅读]redis持久化
  7. shell特殊符号cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号下
  8. #51CTO学院四周年#其实、其实,我就是来吐槽的”
  9. 移动端H5页面高清多屏适配方案
  10. 项目经验—Skype客户端内网无法共享PPT