android之JSON 进行网络数据交换

什么是JSON

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON 采用与编程语言无关的文本格式,但是也使用了类C 语言的习惯,这些特性使JSON 成为理想的数据交换格式。和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输
一个数组,或者一个复杂的 Object 对象。String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的字符串

“ abc ”,其格式为:"abc"。除了字符 ",\,/ 和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他 Unicode 字符可以直接输出。


       Boolean 类型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意,true、false和 null 都没有双引号,否则将被视为一个 String 。

JSON 还可以表示一个数组对象,使用 [] 包含所有元素,每个元素用逗号分隔,元素可以是任意的
Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null:

["abc",12345,false,null]

Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的
Object 相当于 Java 中的 Map<String, Object>,而不是 Java 的 Class 。注意 Key 只能用 String 表
示。例如,一个 Address 对象包含如下 Key-Value:
                                        city:Beijing
                                         street:Chaoyang Road
                                       postcode:100025(整数)
用JSON 表示如下:

       

{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
其中 Value 也可以是另一个 Object 或者数组,因此,复杂的 Object 可以嵌套表示,例如,一个
Person 对象包含 name 和 address 对象,可以表示如下:

        

{"name":"Michael","address":
 {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
 }


下面写一个实例:(记得服务器端要先导包)

     这是在我曾经写好的代码上写的,我现在把主要代码写下。

     新建一个servlet:

      

package cn.four.json;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.print.event.PrintServiceAttributeEvent;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import cn.four.service.Foundservice;
import cn.four.service.FoundserviceImp;
import cn.four.user.Found;



public class JSONDemoServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Foundservice fd=new FoundserviceImp();   //我这是以前写过的,继承接口
		
		List<Found> list=fd.getfound();       //new 一个list
		JSONObject jsb=new JSONObject();      //new 一个JSONObject对象
		
		jsb.put("foundlist",list);           //得到转成后的数据
		
		JSONArray fdarray=jsb.getJSONArray("foundlist");     //存到数组
		
		response.setContentType("text/plain");//解决乱码
		response.setCharacterEncoding("UTF-8");
		PrintWriter out=response.getWriter();
		 out.write(fdarray.toString());   //关闭
		 out.flush();
		 out.close();
		
	}

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

		
	}

}
服务器端就这样结束了。

下面是android的介绍

         Android SDK 提供了Apache 的HttpClient 类处理网络访问,相信很多读者朋友都在其他项目当中用
到过HttpClient。我写了一个方法类,获取某一网址的网页内容,代码如下:

package com.four.http;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

public class httpcontent {
	
	public String getContent(String url) throws Exception {
		StringBuilder sb = new StringBuilder();

		HttpClient client = new DefaultHttpClient();
		HttpParams httpParams = client.getParams();
		// 设置网络超时参数
		HttpConnectionParams.setConnectionTimeout(httpParams, 3000);
		HttpConnectionParams.setSoTimeout(httpParams, 5000);
		HttpResponse response = client.execute(new HttpGet(url));
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					entity.getContent(), "UTF-8"), 8192);

			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}
			reader.close();
		}
		return sb.toString();
}

}

我感觉这就是一个固定的类,只要用到JSON,就可以拿去用,暂时没试,不知道对不对啊。

      

package com.example.mychat;

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

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

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.four.http.httpcontent;

public class User_tips extends Activity {

	httpcontent content = new httpcontent();
	private Button btnshua;
	private ListView xianshi;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_user_tips);
		btnshua = (Button) findViewById(R.id.btnshua);
		xianshi = (ListView) findViewById(R.id.listView1);
		btnshua.setOnClickListener(new shualistener());

	}

	class shualistener implements OnClickListener {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub		
			listxianshi();
		}

	}

	private List<Map<String, Object>> getmessg(String url) {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		String body;
		try {
			body = content.getContent(url);
			JSONArray array = new JSONArray(body);
			for (int i = 0; i < array.length(); i++) {
				JSONObject obj = array.getJSONObject(i);
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("foundname", obj.getString("foundname"));
				map.put("foundplace", obj.getString("foundplace"));
				list.add(map);
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	private void listxianshi(){
		try {
			String url = "http://10.20.180.34:8080/lostfound/JSONDemoServlet";
			SimpleAdapter adapter = new SimpleAdapter(this,
					getmessg(url), R.layout.list_item, new String[] {
							"foundname", "username" }, new int[] {
							R.id.foundname, R.id.username });
			xianshi.setAdapter(adapter);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

效果图:


android json 轻量级的数据交换格式

08-27

转自: [url=http://blog.csdn.net/shazhuzhux/article/details/6301386][/url]rnrnrn1、JSON(JavaScript Object Notation) 定义:rn一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.orgrn rn2、JSON的结构:rn(1) Name/Value Pairs(无序的):类似所熟知的Keyed list、 Hash table、Disctionary和Associative array。在Android平台中同时存在另外一个类 "Bundle",某种程度上具有相似的行为。rn(2) Array(有序的):一组有序的数据列表。rn对象rn对象是一个无序的Name/Value Pairs集合。 name:value , name:value , name:value .... rn例子: "name":"小猪","age":20 rn Arrayrn  Array是值(value)的有序集合。[ value , value , value ...... ] rn  值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。rn  字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 例如:\ + " \ / b f n r t u 进行转义。rn例子1: Array里面包含对象(object)rn[ "id":1,"name":"小猪" ,"age”:22 , "id":2,"name":"小猫","age”:23 , .......]rn rn例子2:同样对象(object)中可以包含Arrayrn(1)一个对象包含1个数组,2个子对象rn"root":["id":"001","name":"小猪","id":"002","name":"小猫","id":"003","name":"小狗"],rn "total":3,rn "success":truernrn rn(2)也可以对象嵌套子对象,子对象再嵌套数组rn"calendar": rn "calendarlist": rn [ rn "id":"001","name":"小猪", rn "id":"002","name":"小猫" rn ] rn rnrn rn总之,格式多种多样,可以互相嵌套rn rn--------------------------------------------------------------------------------------------rn在Android中包含四个与JSON相关的类和一个Exceptions:rnJSONArrayrnJSONObjectrnJSONStringerrnJSONTokenerrnJSONExceptionrn(1)JSONObject:rn这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。rn它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:“JSON”: “Hello, World”,最外被大括号包裹,其中的Key和Value被冒号”:”分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之间是以逗号”,”分隔。rnValue的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。rn有两个不同的取值方法:rnget(): 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息。rnopt(): 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。rn rn(2)JSONArray:rn它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。rn同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。rn rn(3)JSONStringer:rn根据官方的解释,这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。rn根据下边的实例来了解其它相关信息:rnrn[code=Java]rnString myString = new JSONStringer().object() rn.key("name")rn.value("小猪") rn.endObject()rn.toString();rnrn[/code]rn 果是一组标准格式的JSON text:"name" : "小猪"rn其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。rn rn(4)JSONTokener:rn这个是系统为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string中提取数值信息。rnJSONException:rn是JSON.org类抛出的异常信息。rn下面引用一个完整的应用实例:rn应用JSONObject存储Map类型数值:rn[code=Java]rnpublic static JSONObject getJSON(Map map) rn Iterator iter = map.entrySet().iterator(); rn JSONObject holder = new JSONObject(); rn while (iter.hasNext()) rn Map.Entry pairs = (Map.Entry) iter.next(); rn String key = (String) pairs.getKey(); rn Map m = (Map) pairs.getValue(); rn JSONObject data = new JSONObject(); rn try rn Iterator iter2 = m.entrySet().iterator(); rn while (iter2.hasNext()) rn Map.Entry pairs2 = (Map.Entry) iter2.next(); rn data.put((String) pairs2.getKey(), (String) pairs2 rn .getValue()); rn rn holder.put(key, data); rn catch (JSONException e) rn Log.e("Transforming", "There was an error packaging JSON", e); rn rn rn return holder; rnrnrn[/code]

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试