android 之json对象解析并展示(含json解析源码)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                android   之json对象解析并展示(含json解析源码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                具體處理思路以及使用到的知識點:
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解析源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: android 之ListView的布局
- 下一篇: android 之自定义Adapt
