您的位置:首页 > 移动开发 > Android开发

android Json数据解析

2014-04-19 15:01 369 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: