Json获取、解析案例演示

JSON有两种表示结构,对象和数组.

对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组

数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

****************************************************案例*******************************************

这里先贴出bean类

Result

package com.lw.bean;

import java.util.ArrayList;
import java.util.List;

public class Result {
	//结果值,如果为2说明返回正确
	private int result;
	private List<Person> personData =  new ArrayList<Person>();
	public int getResult() {
		return result;
	}
	public void setResult(int result) {
		this.result = result;
	}
	public List<Person> getPersonData() {
		return personData;
	}
	public void setPersonData(List<Person> personData) {
		this.personData = personData;
	}

}

Person

package com.lw.bean;

import java.util.List;

public class Person {
	private String url;
	private String name;
	private int age;
	private List<SchoolInfo> schoolInfo;

	public List<SchoolInfo> getSchoolInfo() {
		return schoolInfo;
	}

	public void setSchoolInfo(List<SchoolInfo> schoolInfo) {
		this.schoolInfo = schoolInfo;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

SchoolInfo

package com.lw.bean;

public class SchoolInfo {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

接下来贴出主界面布局和Listview中的每个item的布局文件

json.xml

<?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"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignParentLeft="true" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:layout_toRightOf="@id/imageView"
        android:padding="10dp" >

        <TextView
            android:id="@+id/name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="name" />

        <TextView
            android:id="@+id/age"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/name"
            android:text="age" />

        <TextView
            android:id="@+id/school1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/age"
            android:text="school1"
            android:textSize="20dp" />

        <TextView
            android:id="@+id/school2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/school1"
            android:text="school2"
            android:textSize="20dp" />
    </RelativeLayout>

</RelativeLayout>

接下来贴出主activity

JsonActivyty

package com.lw.http01;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ListView;

public class JsonActivyty extends Activity {

	private ListView listView;
	private JsonAdapter jsonAdapter;
	private Handler handler = new Handler();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		/** json布局文件中,只有一个listview控件 */
		setContentView(R.layout.json);
		listView = (ListView) findViewById(R.id.listView);
		/**
		 * 一开始是没有数据的,后来从服务器获取在子线程中跟新数据和ui界面的
		 *
		 */
		jsonAdapter = new JsonAdapter(this);

		/**
		 * 服务度http://192.168.79.101:8080/testAndroidServer/jsonServlet就能获取到json数据
		 * 这里没有贴出服务端代码,知道上面一句话就够了
		 */
		new JsonThread(
				"http://192.168.79.101:8080/testAndroidServer/jsonServlet",
				this, listView, jsonAdapter, handler).start();
	}
}

接下来循序渐进先贴出

JsonThread

package com.lw.http01;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.os.Handler;
import android.widget.ListView;
import android.widget.Toast;

import com.lw.bean.Person;
import com.lw.bean.SchoolInfo;

public class JsonThread extends Thread {

	/**
	 * url是服务器地址
	 * context是环境,需要toast提示
	 * listview是需要setadapter的设置适配器
	 * jsonAdapter是需要设置数据的
	 * handler是需要子线程更新ui的
	 */
	private String url;
	private Context context;
	private ListView listView;
	private JsonAdapter jsonAdapter;
	private Handler handler;

	public JsonThread(String url, Context context, ListView listView,
			JsonAdapter jsonAdapter, Handler handler) {
		this.url = url;
		this.context = context;
		this.listView = listView;
		this.jsonAdapter = jsonAdapter;
		this.handler = handler;
	}

	@Override
	public void run() {
		try {
			// 创建URL对象,并且设置相应的参数
			URL httpurl = new URL(url);
			//打开连接
			HttpURLConnection conn = (HttpURLConnection) httpurl
					.openConnection();
			conn.setReadTimeout(5000);
			conn.setRequestMethod("GET");

			// 从服务器读取数据,需要读入流
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));

			// 读取完毕,就存放到StringBuffer容器中
			StringBuffer sb = new StringBuffer();
			String str = "";
			while ((str = reader.readLine()) != null) {
				// 当读取完毕,就添加到容器中
				sb.append(str);
			}
			// 将读取到的Json字符串,进行解析为Person对象集合
			final List<Person> parseJson = parseJson(sb.toString());
			// handler在子线程中更新数据
			handler.post(new Runnable() {

				@Override
				public void run() {
					// 设置数据到adapter视图中,使其获取到数据
					jsonAdapter.setData(parseJson);
					// 设置适配器
					listView.setAdapter(jsonAdapter);
				}
			});

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/***
	 * 解析服务端返回的Json字符串数据,因为adapter的视图中item是一个个Person对象,所以返回Person集合即可
	 * 这里用android的原生解析
	 */
	private List<Person> parseJson(String json) {
		//json解析完毕,返回person的集合对象
		List<Person> persons = new ArrayList<Person>();
		try {
			/**
			 * {"1":[{person对象},{person对象},{person对象}]}
			 * 所以整体是个json对象,而不是json数组
			 * 所以创建JSONObject对象
			 */

			JSONObject jsonObj = new JSONObject(json);
			//获取result值
			int result = jsonObj.getInt("result");

			//如果为2说明返回正确
			if (result == 2) {
				//获取person的json数组
				JSONArray personData = jsonObj.getJSONArray("personData");

				/**
				 * 循环解析每一个person对象
				 */
				for (int i = 0; i < personData.length(); i++) {
					//创建person对象
					Person personObj = new Person();
					List<SchoolInfo> scInfos = new ArrayList<SchoolInfo>();

					//从json对象数组中获取每一个json类型的person对象
					JSONObject person = personData.getJSONObject(i);
					//为person对象设置json类型的person对象的值
					personObj.setName(person.getString("name"));
					personObj.setAge(person.getInt("age"));
					personObj.setUrl(person.getString("url"));

					/**获取json类型的person中的school信息*/
					JSONArray scs = person.getJSONArray("schoolInfo");
					for (int j = 0; j < scs.length(); j++) {
						SchoolInfo schoolObj = new SchoolInfo();
						JSONObject school = scs.getJSONObject(j);
						schoolObj.setName(school.getString("name"));
						scInfos.add(schoolObj);
					}

					personObj.setSchoolInfo(scInfos);
					persons.add(personObj);

				}
			} else {
				Toast.makeText(context, "error", 1);
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return persons;
	}

}

接下来贴出适配器的代码

JsonAdapter

package com.lw.http01;

import java.util.List;

import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.lw.bean.Person;
import com.lw.bean.SchoolInfo;

public class JsonAdapter extends BaseAdapter {

	private List<Person> list;
	private Context context;
	private LayoutInflater inflater;
	private Handler handler = new Handler();

	public JsonAdapter(Context context) {
		this.context = context;
		inflater = LayoutInflater.from(context);
	}

	public JsonAdapter(List<Person> list, Context context) {
		this.list = list;
		this.context = context;
		inflater = LayoutInflater.from(context);
	}
	/**
	 * 设置数据的,数据是从服务器解析过来的
	 * @param list
	 */
	public void setData(List<Person> list){
		this.list = list;
	}

	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.item, null);
			holder = new ViewHolder(convertView);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		/***
		 * item的数据是从setData中得来的,是jsonThread中handler操作的
		 */
		Person person = list.get(position);
		holder.name.setText(person.getName());
		holder.age.setText(person.getAge()+"");

		List<SchoolInfo> scs = person.getSchoolInfo();
		holder.school1.setText(scs.get(0).getName());
		holder.school2.setText(scs.get(1).getName());
		//这里的图片信息,也是需要开启子线程,进行获取,需要传递这3个参数
		new HttpImage(holder.imageView, person.getUrl(), handler).start();
		return convertView;
	}

	/**
	 * viewHodler不解释
	 *
	 */
	class ViewHolder {
		private TextView name;
		private TextView age;
		private TextView school1;
		private TextView school2;
		private ImageView imageView;

		public ViewHolder(View view) {
			name = (TextView) view.findViewById(R.id.name);
			age = (TextView) view.findViewById(R.id.age);
			school1 = (TextView) view.findViewById(R.id.school1);
			school2 = (TextView) view.findViewById(R.id.school2);
			imageView = (ImageView) view.findViewById(R.id.imageView);
		}
	}
}

接下来图片获取的线程

HttpImage

package com.lw.http01;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.widget.ImageView;

public class HttpImage extends Thread {
	/**
	 * imageview是需要在分线程中handler更新ui的
	 * url是图片的url
	 * handler是子线程跟新ui操作的
	 */
	private ImageView imageView;
	private String url;
	private Handler handler;

	public HttpImage(ImageView imageView, String url, Handler handler) {
		this.imageView = imageView;
		this.url = url;
		this.handler = handler;
	}

	@Override
	public void run() {
		try {
			/**
			 * 跟jsonThread操作一样,系列的参数
			 */
			URL httpurl = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();
			conn.setReadTimeout(5000);
			conn.setRequestMethod("GET");
			//这样的方式也可以获取一个图片  decodeStream
			final Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());

			handler.post(new Runnable() {

				@Override
				public void run() {
					//子线程中直接更新界面
					imageView.setImageBitmap(bitmap);
				}
			});

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (ProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 20:55:07

Json获取、解析案例演示的相关文章

iOS网络编程解析协议三:JSON数据传输解析

作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,我们会陷入繁琐复杂的数据节点查找中 作为一种轻量级的数据交换格式,JSON正在逐步取代XML,成为网络数据的通用格式 从iOS 5开始,使用NSJSONSerialization对JSON解析 其他常见的三种JSON解析第三方库:SBJso

Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

Android JSON原生解析的几种思路,以天气预报为例 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家还是很有帮助的,老司机要开车了 涉及到网络,你就一定要先添加权限,准没错 <!--网络权限--> <uses-permission android:name="android.permission.INTERNET" /> 一.归属地查询(JSONObject) 这个也是最简单的一类Json

【Qt编程】基于Qt的词典开发系列&amp;lt;九&amp;gt;--JSON数据解析

在上一篇文章<用户登录及API调用的实现>中,我通过程序实现了用户登录及API调用的实现.从而能够实现网络查词.添词的操作.可是.从上文中能够看到.调用API后返回的是JSON格式的数据,例如以下图所看到的(在QtCreator中的显示): 为了更好的观察JSON格式.我整理后显演示样例如以下: 显然.为了显示查词的结果,我们必须在上图中提取实用的信息,并正确的显示出来. 上图中每一行内容的意思我已经在文章<调用网络API>中作了解释.我在词典中选择想要显示的内容有:单词本身.单词

Android之JSON全面解析与使用

Android之JSON全面解析与使用 什么是JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 (单纯的数据格式,不受语言的约束) JSON 具有自我描述性,更易理解 对于JSON的定义以及数据格式,没有什么太多的难点,这里为官网对JSON的定义.从官网描述中可以看出,JSON本身是JavaScript中对象的描述格式,后来得以推广并逐渐取代xml. JSON和XML的

json数据解析,并实现将网络json数据获取用listview显示

需要使用jar包 fastjson或gson这两个jar包. //Gson的使用方式 Gson gson=new Gson(); String str=ReadAssetsFile.readtext(this,"json_ss");//this当前类,"json_ss"需要解析的文件名 UserMessage userMessage=gson.fromJson(str,UserMessage.class);//需要解析的json文件最外层类名 //fastjson的

Android JSON数据解析(GSON方式)

要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Java对象,或是将一个Java对象转换为相应的JSON数据. 1.GSON的两个重要方法 在GSON的API中,提供了两个重要的方法:toJson()和fromJson()方法.其中,toJson()方法用来实现将Java对象转换为相应的JSON数据,fromJson()方法则用来实现将JSON数据转换

开源项目OkHttpPlus——支持GET、POST、UI线程回调、JSON格式解析、链式调用、文件上传下载

OkHttpPlus介绍 项目地址:https://github.com/ZhaoKaiQiang/OkHttpPlus 主要功能:OkHttp封装,支持GET.POST.UI线程回调.JSON格式解析.链式调用.小文件上传下载及进度监听等功能 为什么要写这么一个库呢? 首先,是因为OkHttp在4.4之后已经作为底层的Http实现了,所以OkHttp这个库很强大,值得我们学习. 其次,在我看来,OkHttp使用起来不如Volley方便,OkHttp的回调都是在工作线程,所以如果在回调里面操作V

IOS - 位置及天气获取解析

参考网址: 经纬度定位:http://blog.csdn.net/whaomian/article/details/6807739 位置解析:http://www.cocoachina.com/bbs/read.php?tid=134893&keyword=%B5%D8%C0%ED%CE%BB%D6%C3 百度天气免费API:http://www.cnblogs.com/txw1958/p/baidu-weather-forecast-api.html AFNetworking访问网络和简单JS

HAProxy基础及案例演示

HAProxy是一种反向代理,能够提供提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,HAProxy特别适用于那些负载特大的web站点.HAProxy实现了一种事件驱动. 单一进程模型,此模型支持非常大的并发连接数.多进程或多线程模型受内存限制 .系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接.事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以可轻易突破c10k的限制. 在正式介绍HAProxy前,让我们先了解下什么交反向代理