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、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一
个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。(如图所示)
2、数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分
隔。值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数
组(array)。这些结构可以嵌套。
在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解析后的数据
Activity:构建url并调用util中的相应方法
httpUtil:用于连接服务器返回json格式的字符串
JsonTools:用于将json字符串解析成对应的model对象
服务器端程序:
action包:Servlet
dom包:Person与客户端中的Person相同
service包:model层,调用相应的接口创建或者保存数据
它是基于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; } }
相关文章推荐
- Android开发之原生解析复杂的json数据
- android 解析json数据格式
- android 将数据转换成JSON数据格式并使用JSONObject解析JSON格式的数据
- Android解析中国天气接口JSon数据,应用于天气查询!
- Android学习系列(20)--App数据格式之解析Json
- android数据解析之json解析和json字符串创建
- android客户端从服务器端获取json数据并解析的实现代码(重要)
- Android使用Gson解析JSON数据
- Android客户端从服务器端获取json数据并解析的实现代码
- Android开发中json数据解析工具类
- Json数据格式介绍、使用Android自带类库完成Json生成与解析
- 【Android应用开发】-(17)获取Google天气预报通过Xml和JSON解析数据
- 在Android中可以使用Gson解析JSON数据
- android 解析json数据格式
- Android使用JSON进行数据解析
- Android 之 json数据的解析(jsonReader)
- android学习二十三(解析json格式数据)
- android针对json数据解析方法实例分析
- Android 之 json数据的解析
- Android开发--Json数据的解析