Android 网络数据交互之JSON

来源:互联网 发布:informix 端口 编辑:程序博客网 时间:2024/06/05 15:19

1.什么是JSON 

     1.1 JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation);

  1.2 是轻量级的文本数据交换格式。所谓轻量级交换格式是指少量的数据存储,效率比较高一些,因为JSON解析速度比较快,同样的数据,写起来比较少用起来比较方便但功能相对不是很强大,可移植性比较好。总的来说就是具有良好的可读和便于快速编写的特性 如传一个人的信息,用JSON可以这样写:

Var person = {name:"xixi",sex:"female"}

然后使用的时候可以这样写:   

person.name,person.sex

      1.3  JSON 独立于语言: JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

  1.4  JSON 具有自我描述性,更易理解


2.JSON建构有两种结构:

 2.1 “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

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


3.JSON的数据格式具体形式:

 3.1 表示一个的String,Boolean,Number,与C或者Java的表示非常相似。

  3.2 表示数组,使用[]包含所有元素,每个元素用逗号隔开,元素可以是任何value, 例如,以下数组包含了一个 String,Number,Boolean 和一个 null:
      ["abc",123,false,null]

  3.3 表示Object对象即“名称/值”对的集合,用{}包含一系列无序的key-value键值对,相当于Java中的map<String,Object>。例如一个 Address 对象包含如下 Key-Value:city:hengyang  street:changsheng Road  postcode:421001(整数),用JSON表示如下: {"city":"hengyang","street":"changsheng Road","postcode":421001}

    其中 Value 也可以是另一个 Object 或者数组因此复杂的 Object 可以嵌套表示,如一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含姓名和地址 :

var = a {"people": [{"name":"xixi","address":"hengyang"},{"name":"hehe","address":"zhuzhou"},{"name":"haha","address":"changsha"}],"course":[{"id":"00000","name":"Chinese ","credit":"2.0"},{"id":"00001","name":"Math ","credit":"3.0"}]}

 3.3.1 访问数据:要想访问a列表的第一个条目的名字,只需在 JavaScript 中使用下面这样的代码:     

a.people[0].name;

 3.3.2 修改json数据:和访问数据差不多,根据数组下标来修改:

a.course[1].name = "English";


4.SON-lib开源库的使用:

   JSONObject:处理一些简单实体类POJO或者map;JSONArray:处理一些数组集合类。即处理数组及list的集合用JSONArray对象;处理对象及map类型用JSONObJect对象。
   两者都可以用来处理从JSON到Java对象的输出,但只有合法和简单JSON格式才能转成相应的Java对象:用fromObject()方法; 也可以从Java对象到JSON格式的输出 : 也用fromObject()方法 。


5. Android JSON解析的方式:

Android的JSON解析部分都在包org.json下,主要有以下几大类:

  JSONObject: 可以看做一个JSON对象;
  JSONArray: 可以看做一个JSON数组;
  JSONString: JSON文本构建类;
  JSONTokener: JSON解析类;
  JSONException: JSON中用到的异常。


6. 代码演示:

   6.1首先,我们创建一个名为User的JavaBean作为用户对象类,用来保存演示数据。

   

/** * 用户类   JavaBean * @author hy * */public class User {public String id;   //用户idpublic String name;   //姓名public String sex;//性别public String address;//地址public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}

       然后在创建一个JsonServlet的类作为服务端的接口程序。先写一个prepareData()为用户列表初始化数据的方法,然后在doPost()里遍历用户列表,把每个用户的数据放在map中,然后把map放入list1中。再用fromObject()将数据以json形式发送到客户端。 

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import hy.users.User;import java.util.ArrayList;import java.util.HashMap; import net.sf.json.JSONArray;/** * 服务端的接口程序 * @author hy * */public class JsonServlet extends HttpServlet {  ArrayList<User> list;   //定义list对象用来保存用户列表 /**  * 处理post方式提交的数据  */protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//设置字符集req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//接收用户界面提交的信息String type = req.getParameter("type");String hello = req.getParameter("hello");System.out.println("type="+type);System.out.println("hello="+hello);//准备用户数据prepareData();ArrayList list1 = new ArrayList();//遍历用户列表,把每个用户的数据放在map中,然后把map放入list1中for(int i=0;i<list.size();i++){   //单个map对象HashMap<String,String> map = new HashMap<String,String>();map.put("id",list.get(i).getId());map.put("name",list.get(i).getName());map.put("sex", list.get(i).getSex());map.put("address", list.get(i).getAddress());list1.add(map);}//将用户列表以json形式发送到客户端    用fromObject()将Java对象转换成json格式输出resp.getWriter().write(JSONArray.fromObject(list1).toString());}/** * 出路get方式提交的数据 */protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doPost(req, resp);} /** 为用户列表初始化数据的方法 */public void prepareData(){list = new ArrayList<User>();User user1 = new User();user1.setId("0");user1.setName("xixi");user1.setSex("male");user1.setAddress("hengyang");list.add(user1); //添加用户数据user1到list中User user2 = new User();user2.setId("1");user2.setName("hehe");user2.setSex("female");user2.setAddress("zhuhzou");list.add(user2); //添加用户数据user2到list中 User user3 = new User();user3.setId("2");user3.setName("haha");user3.setSex("male");user3.setAddress("changsha");list.add(user3); //添加用户数据user3到list中}}

       把JsonServlet部署到tomcat中可以在浏览器中看到:


      6.2  接着写Android客户端的程序。  在访问网络,或者服务器的数据一定要注意 网络权限的声明: 

  <uses-permission android:name="android.permission.INTERNET"/>
      首先和服务端一样写一个名为User的JavaBean作为用户对象类。然后写一个发送请求到服务端的方法sendToServlet(),用异步请求发送数据到服务端,用post方法发送,然后在回调函数onSuccess()方法中接收服务端传来的数据:

import java.util.ArrayList;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.JsonHttpResponseHandler;import com.loopj.android.http.RequestParams;import com.util.User;import android.os.Bundle;import android.app.Activity;import android.view.Menu;/** * 主界面 * @author hy * */public class MainActivity extends Activity {String id,name,sex,address;ArrayList<User> list = new ArrayList<User>();//TextView textView = (TextView)findViewById(R.id.textView1);  @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//设置显示的布局文件sendToServlet("android","hello");}/**  * 发送请求道服务端 * @param android 标识 */public ArrayList<User> sendToServlet(String android,String hello){ AsyncHttpClient ahc = new AsyncHttpClient();//异步客户端对象 RequestParams params = new RequestParams();//请求参数对象 params.put("type",android); params.put("hello", hello); System.out.println("发送请求---------------------"); //用post方法发送 ahc.post("http://192.168.1.104:8080/jsontest/JsonServlet", params,new JsonHttpResponseHandler(){ /** 接收服务端传来的数据 */@Overridepublic void onSuccess(JSONArray response) {super.onSuccess(response);System.out.println("接收服务端传回的数据+++++++++++++++++++++");System.out.println("response==="+response);  //取出response中的数据for(int i=0;i<response.length();i++){User user = new User();try {  //单个json对象  用object对象取出response中的值JSONObject jo = response.getJSONObject(i);id =  jo.getString("id");name = jo.getString("name");sex = jo.getString("sex");address = jo.getString("address");user.setId(id);user.setName(name);user.setSex(sex);user.setAddress(address);list.add(user);} catch (JSONException e) {e.printStackTrace();}}prtintdata();} });return list;}/** 输出数据  */public void prtintdata(){for(int i=0;i<list.size();i++){System.out.print("id="+list.get(i).getId()+"  ");System.out.print("name="+list.get(i).getName()+"  ");System.out.print("sex="+list.get(i).getSex()+"  ");System.out.println("adderss="+list.get(i).getAddress());}}  @Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);  //放listview里面组件的XMLreturn true;}}




                                               
        

0 0
原创粉丝点击