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;
}
}