Android JSON解析数据

一:json的简介

json指的是Javascript对象表示法,是一种轻量级文本数据交换格式,类似于XML,但比XML更小、更快、更易解析

 

二:Json与XML的比较(copy网上的)

优点:

      比xml格式简单;
      json是更好的数据交换格式;xml是更好的文档交换格式;
      json更易于机器阅读,使用简单的客户端库或者自身支持(javascript);
      json可被浏览器客户端支持;
      可支持各种通用的数据结构,记录、列表、树;
      21种语言支持可解析和生成json格式
缺点:

      没有xml中类似CDATA的特性,不适合传递声音和图片等二进制数据;
      json不具备显示能力,和xml相比;
      json不可扩展,和xml相比。

 

 三:json用于描述数据结构有两个方式

1,"名称/值”对的集合,又称为JSON Object,名与值之前用“:”分隔开来

{name:value}

例如:

{"width":"123","Height":"456"}

 2,值的有序列表,又称为JSON Array

例如:

{"employee":[{"width":"123" , "height":"345"} , {"width":"234" , "height":"455"}  , {"width":"566" , "height":"269"}]}

 

四:json解析数据需要的jar包

技术分享

 

五:json数据解析

解析json数据的时候,要分清是解析 JSON Object 还是JSON Array,然后再解析

(1)解析JSON Object之一

例如:解析   {"name" : "value"}

 

通过JSONObject.getString("name")方法就可以得到JSON对象中String名称的值

//创建JSONObject,将jsonString字符串转换JSON 对象对应的文本

JSONObject demoJson = new JSONObject(jsonString);

String s = demoJson.getString("name");//就可以得到name对应的值

 

(2) 解析 JSON Object之二

一个包括两个“名称/值”

{“name1” :“android:” ,“name2” : ”java“}

 

通过JSONObject.getString("name")方法就可以得到JSON对象中String名称的值

//创建JSONObject,将jsonString字符串转换JSON 对象对应的文本

JSONObject demoJson = new JSONObject(jsonString);

String name1 = demoJson.getString("name1");

String name2 = demoJson.getString("name2");

 

(3) 解析JSON Array

解析json文本  {”number“ :”1,1,3,5“}

//创建JSONArray,将 jsonString字符串转换JSON 对象对应的文本

JSONObject demoJson = new JSONObject(jsonString);

 

//获取number对用的数组

JSONArray list = demoJson.getJSONArray("number");

for(int i = 0,k = list.length(); i < k; i ++)

{

      //其他的用getString(i),,,类似

       System.out.println(list.getInt(i));

}

 

(4)解析JSON Oject与JSON Array混合对象

{"books" : [{"zhang" : "value1" , "zhang" : "value2"}]}

JSONObject demoJson = new JSONObject(jsonString);

//首先是要获取books对应的值

JSONArray list = demoJson.getJSONArray("books");

//然后依次取出list里面的值

for(int i = 0, k = list.length() ; i < k; i++)

{

   //第i个JSONArray中的值为JSON Object “名称/值”对,然后通过getString("zhang")来获取值

    System.out.println(list.getJSONObject( i ).getString("zhang"));

}

 

 服务器里面的数据

 

package com.test.Demo;

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

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;


public class JSONDemoServlet extends HttpServlet {
	private static final long serialVersionUID = -7368225680407826408L;   
    private List<User> list;
    
    /**
     * 处理post方式提交的数据
     */
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
	
	/**
	 * 出来get方式提交的数据
	 */
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/plain");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		
		 //准备用户数据   
	    prepareData();
	    
	    //JSON数组   
	   JSONArray array = new JSONArray();
	   
	   for(User bean :list){
         //单个用户JSON对象 
		   JSONObject obj = new JSONObject(); 
		   try{
			   
			   obj.put("id", bean.getId());
			   obj.put("name", bean.getName());
			   obj.put("email", bean.getEmail());
			   obj.put("gender", bean.getGender());  
		   }catch (Exception e) {
			// TODO: handle exception
		}
		  //array.put(obj); 
		  array.add(obj);
	   } 
	   //输出   
	   out.write(array.toString());   
	   out.flush();   
	   out.close(); 
	} 
	
	
	private void prepareData()
	   {
		list = new ArrayList<User>();
		User bean1 = new User();
		bean1.setId(1001); 
		bean1.setName("Tony"); 
		bean1.setEmail("[email protected]"); 
		bean1.setGender("male");  
		list.add(bean1); 
		
		User bean2 = new User();
		bean2.setId(1002);
		bean2.setName("Jack"); 
	    bean2.setEmail("[email protected]");
	    bean2.setGender("male");  
	    list.add(bean2); 
	    
	    User bean3 = new User();
	    bean3.setId(1003);   
	    bean3.setName("Marry");
	    bean3.setEmail("[email protected]");
	    bean3.setGender("female");
	    list.add(bean3);
	    
	    User bean4 = new User();
	    bean4.setId(1004); 
	    bean4.setName("Linda");
	    bean4.setEmail("[email protected]");  
	    bean4.setGender("female"); 
	    list.add(bean4);	    
	   }
	
}

 

 

 

所对应的对象文本为:

package com.test.Demo;

public class User {
	private int id;

	private String name;

	private String email;

	private String gender;

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 

 

 

在客户端创建TextView来显示解析的数据

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

 


主MainActivity

 

package com.test;

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;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		try {
			StringBuffer sb = new StringBuffer();
		
			String url = "http://192.168.1.100:8080/article/JSONDemoServlet";
			String body = getContent(url);
			JSONArray array = new JSONArray(body);
			for (int i = 0; i < array.length(); i++) {
				JSONObject obj = array.getJSONObject(i);
				sb.append("id:").append(obj.getInt("id")).append("\t");
				sb.append("name:").append(obj.getString("name")).append("\r\n");
				sb.append("gender:").append(obj.getString("gender")).append(
						"\t");
				sb.append("email:").append(obj.getString("email")).append(
						"\r\n");
				sb.append("----------------------\r\n");
			}
			TextView textView = (TextView) findViewById(R.id.textView);
			textView.setText(sb.toString());
		} catch (Exception e) {
			// TODO: handle exception
		}

	}

	private 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();
	}

}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。