android Json数据解析

JSON(JavaScript Object Notation) 定义:

它是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换格式,主要用于用

于跟服务器进行交换数据。跟XML相类似,它独立于语言,在跨平台数据传输上有很大的优势,具有良好的可读和便

于快速编写的特性。业内主流技术为其提供了完整的解决方案(获得了当今大部分语言的支持),从而可以在不同平台

间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为


Json数据的结构 :

JSON建构有两种结构:

1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录

(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组

(associative array)。

2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

详细参考:JSON官方网站


Json数据的具体表现形式:

1、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一

个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。(如图所示)


{name:"中国",province:“黑龙江",cities:"哈尔滨}

2、数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分

隔。值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数

组(array)。这些结构可以嵌套。



{ "people": 
     [ 
     { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, 
     { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"}, 
     { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } 
  ]
} 


在Android中包含四个与JSON相关的类和一个Exceptions:

JSONArray:这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。

JSONObject:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗

号”,”分隔(例如:[value1,value2,value3]

JSONStringer:这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异

常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSON text。每个JSONStringer实体只能对应创

建一个JSON text。

JSONTokener:这个是系统为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string

中提取数值信息。


Json数据的生成 :





Json数据的解析:



实例详解:

domain:用于存放json解析后的数据

package com.example.domain;

public class Person {
	String name;
	int age;
	String address;

	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 getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address
				+ "]";
	}

}

Activity:构建url并调用util中的相应方法

package com.example.se02_05_jsontest;

import java.util.List;

import com.example.domain.Person;
import com.example.util.JsonTools;
import com.example.util.httpUtil;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
	private Button bt1, bt2, bt3, bt4;
	private String url = "http://192.168.0.107:8080/jsonCode/servlet/action";
	private final static String TAG = "BIG ERROR";
	httpUtil httpUtil;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		bt1 = (Button) findViewById(R.id.button1);
		bt2 = (Button) findViewById(R.id.button2);
		bt3 = (Button) findViewById(R.id.button3);
		bt4 = (Button) findViewById(R.id.button4);

		bt1.setOnClickListener(this);
		bt2.setOnClickListener(this);
		bt3.setOnClickListener(this);
		bt4.setOnClickListener(this);

		httpUtil = new httpUtil();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			String url_path1 = url + "?action_flag=person";
			String jsonString = httpUtil.getJsonContent(url_path1);
			Person person = JsonTools.getPerson("person", jsonString);
			Log.e(TAG, person.toString() + jsonString);
			break;
		case R.id.button2:
			String url_path2 = url + "?action_flag=persons";
			String jsonString2 = httpUtil.getJsonContent(url_path2);
			List<Person> person2 = JsonTools.getListPerson("persons",
					jsonString2);
			Log.e(TAG, person2.toString());
			break;
		case R.id.button3:
			String url_path3 = url + "?action_flag=listString";
			String jsonString3 = httpUtil.getJsonContent(url_path3);
			List<String> person3 = JsonTools.getListString("listString",
					jsonString3);
			Log.e(TAG, person3.toString());
			break;
		case R.id.button4:
			String url_path4 = url + "?action_flag=listMap";
			String jsonString4 = httpUtil.getJsonContent(url_path4);
			List<String> person4 = JsonTools.getListString("listMap",
					jsonString4);
			Log.e(TAG, person4.toString());
			break;

		}

	}

}
util:

httpUtil:用于连接服务器返回json格式的字符串

package com.example.util;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.util.Log;

public class httpUtil {

	public String getJsonContent(String url_path) {
		// httpResponse = null;
		String jsonString = "";
		DownTask downTask = new DownTask(jsonString, url_path);
		new Thread(downTask).start();

		while (true) {
			if (downTask.getJsString() != "") {
				Log.e("BIG ERROR", "ok" + "  " + downTask.getJsString());
				return downTask.getJsString();
			}
		}

	}

	class DownTask implements Runnable {
		String url_path;
		String jsonString1;

		public DownTask(String jsonString, String url_path) {
			this.jsonString1 = jsonString;
			this.url_path = url_path;
		}

		@Override
		public void run() {
			try {
				HttpClient httpClient = new DefaultHttpClient();
				HttpGet httpGet = new HttpGet(url_path);
				HttpResponse httpResponse = httpClient.execute(httpGet);

				if (httpResponse.getStatusLine().getStatusCode() == 200) {
					// 使用getEntity方法获得返回结果
					jsonString1 = EntityUtils
							.toString(httpResponse.getEntity());
				}

			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		public String getJsString() {
			return jsonString1;
		}
	}

}

JsonTools:用于将json字符串解析成对应的model对象

package com.example.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

import com.example.domain.Person;

public class JsonTools {
	public static Person getPerson(String key, String jsonString) {
		Person person = new Person();
		try {
			JSONObject jsonObject = new JSONObject(jsonString);
			JSONObject personObject = jsonObject.getJSONObject(key);
			person.setName(personObject.getString("name"));
			person.setAge(personObject.getInt("age"));
			person.setAddress(personObject.getString("address"));

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

	public static List<Person> getListPerson(String key, String jsonString) {
		List<Person> list = new ArrayList<Person>();
		try {
			JSONObject jsonObject = new JSONObject(jsonString);
			JSONArray jsonArray = jsonObject.getJSONArray(key);
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject personObject = jsonArray.getJSONObject(i);
				Person person = new Person();
				person.setName(personObject.getString("name"));
				person.setAge(personObject.getInt("age"));
				person.setAddress(personObject.getString("address"));

				list.add(person);
			}

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return list;
	}

	public static List<String> getListString(String key, String jsonString) {
		List<String> list = new ArrayList<String>();
		try {
			JSONObject jsonObject = new JSONObject(jsonString);
			JSONArray jsonArray = jsonObject.getJSONArray(key);
			for (int i = 0; i < jsonArray.length(); i++) {
				list.add(jsonArray.getString(i));
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return list;
	}

	public static List<Map<String, Object>> getListMap(String key,
			String jsonString) {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		try {
			JSONObject jsonObject = new JSONObject(jsonString);
			JSONArray jsonArray = jsonObject.getJSONArray(key);
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject personObject = jsonArray.getJSONObject(i);
				Map<String, Object> map = new HashMap<String, Object>();
				Iterator<String> iterator = personObject.keys();
				while (iterator.hasNext()) {
					String json_key = iterator.next();
					Object json_value = personObject.get(json_key);
					if (json_value == null)
						json_value = "";
					map.put(json_key, json_value);
				}
				list.add(map);
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return list;
	}
}

服务器端程序:

action包:Servlet

package com.zwu.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zwu.service.Service;
import com.zwu.utils.JsonTools;

public class action extends HttpServlet {

	private Service service;

	public action() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html,charset=utf-8");
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();

		// String jsonData=JsonTools.CreateJsonString("person",
		// service.getListMap());
		String jsonData = "";
		String action_flag = request.getParameter("action_flag");
		if (action_flag.equals("person"))
			jsonData = JsonTools
					.CreateJsonString("person", service.getPerson());
		else if (action_flag.equals("persons"))
			jsonData = JsonTools.CreateJsonString("persons",
					service.getListPerson());
		else if (action_flag.equals("listString"))
			jsonData = JsonTools.CreateJsonString("listString",
					service.getListString());
		else if (action_flag.equals("listMap"))
			jsonData = JsonTools.CreateJsonString("listMap",
					service.getListMap());
		out.println(jsonData);
		out.flush();
		out.close();
	}

	public void init() throws ServletException {
		service = new Service();
	}
}

dom包:Person与客户端中的Person相同

service包:model层,调用相应的接口创建或者保存数据

package com.zwu.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.zwu.dom.Person;

public class Service {
	public Person getPerson() {
		Person person = new Person("zhangsan", 18, "beijing");
		return person;
	}

	public List<Person> getListPerson() {
		List<Person> list = new ArrayList<Person>();
		Person person1 = new Person("zhangsan", 18, "beijing");
		Person person2 = new Person("lisi", 28, "tianjing");
		Person person3 = new Person("wangwu", 38, "shanghai");
		list.add(person1);
		list.add(person2);
		list.add(person3);

		return list;
	}

	public List<String> getListString() {
		List<String> list = new ArrayList<String>();
		list.add("beijing");
		list.add("tianjing");
		list.add("shanghai");
		return list;
	}

	public List<Map<String, Object>> getListMap() {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map1 = new HashMap<String, Object>();
		Map<String, Object> map2 = new HashMap<String, Object>();
		Map<String, Object> map3 = new HashMap<String, Object>();

		map1.put("name", "zhangsan");
		map1.put("age", 18);
		map1.put("address", "beijing");

		map2.put("name", "lisi");
		map2.put("age", 28);
		map2.put("address", "tianjing");

		map3.put("name", "wangwu");
		map3.put("age", 38);
		map3.put("address", "shanghai");

		list.add(map1);
		list.add(map2);
		list.add(map3);

		return list;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值