博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Android 解析JSONObject以及JSONArray对比

Posted on 2014-11-15 17:05  不剃头的一休哥  阅读(464)  评论(0编辑  收藏  举报

在Android客户端与服务器交互的过程中,客户端一般采用json解析服务器的返回数据。此时有两种数据格式。但其根本都是字符串或字符串数组!

1、JSONObject

下面是PHP端代码:

<?php
$array = array(
  'username'=>'lhh',
  'password'=>'123456',
  'user_id'=>'1'
);
echo json_encode($array);
?>

我们这里只是模拟,所以,在没有服务器的情况下,也可以在java代码中定义,如下:

String strJson = "{"username":"lhh","password":"123456","user_id":"1"}";

下面是android代码:

//by 不剃头的一休哥 2014//11/15

package com.example.jsonjs;

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

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

import android.app.Activity;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		new Thread(new Runnable(){

			@Override
			public void run() {
				Looper.prepare();
				// TODO Auto-generated method stub
				HttpClient client = new DefaultHttpClient();
			    StringBuilder builder = new StringBuilder();
			    //地址根据实际情况而定
			    HttpGet myget = new HttpGet("http://192.168.1.104/login.php");
			    try {
			        HttpResponse response = client.execute(myget);
			        BufferedReader reader = new BufferedReader(new InputStreamReader(
			        response.getEntity().getContent()));
			        for (String s = reader.readLine(); s != null; s = reader.readLine()) {
			            builder.append(s);
			        }
			        //转化为JSONObject
			        JSONObject jsonObject = new JSONObject(builder.toString());
			        String re_username = jsonObject.getString("username");
			        String re_password = jsonObject.getString("password");
			        
			        //setTitle("用户id_"+re_user_id);
			        Log.v("url response", "true="+re_username);
			        Log.v("url response", "true="+re_password);
			        //tv1.setText(re_username);
			        //tv2.setText(re_password);
			        //Toast.makeText(getApplicationContext(), re_username, Toast.LENGTH_LONG).show();
			    } catch (Exception e) {
			        Log.v("url response", "false");
			       // Toast.makeText(getApplicationContext(), "false", Toast.LENGTH_LONG).show();
			        e.printStackTrace();
			    }
			    Looper.loop();
			}}).start();				
	}
}

该代码需要服务器,如果是在java定义的json数据。

2、JSONArray

下面是PHP代码(我用到了数据库)

<?php
$link=mysql_connect("localhost","username","password");
mysql_query("SET NAMES utf8");
mysql_select_db("test",$link);
$sql=mysql_query("select * from teacher ",$link);
while($row=mysql_fetch_assoc($sql))
    $output[]=$row;
echo json_encode($output);
mysql_close();
?>

当然也可以仿照上述在java代码中定义,如下:

String strJson = "[{"id":"1","name":"wang"},{"id":"2","name":"liu"}]";

下面是android代码:

//by 不剃头的一休哥 2014/11/15

package com.example.jsonjsarr;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

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.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);		
		new Thread(new Runnable() {			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Looper.prepare();
				getServerJsonDataWithTypes();
				Looper.loop();
			}
		}).start();
		
		
	}
	private void getServerJsonDataWithTypes() {
		// TODO Auto-generated method stub
		
		int res = 0;
		HttpClient client = new DefaultHttpClient();
		StringBuilder str = new StringBuilder();
		//此处地址根据实际情况而定
		HttpGet httpGet = new HttpGet("http://192.168.1.104/login.php");
		
		try{	
			
			HttpResponse httpRes = client.execute(httpGet);			
			res = httpRes.getStatusLine().getStatusCode();			
			if(res == 200)
			{
				BufferedReader buffer = new BufferedReader(new InputStreamReader(httpRes.getEntity().getContent()));
				String s = buffer.readLine();				
				for(;s!=null;s=buffer.readLine())
				{
					str.append(s);					
				}
				//字符串转化为JSONArray			
				JSONArray json = new JSONArray(str.toString());			
				String strs=" ";				
				for(int i = 0;i<json.length();i++)
				{
					//按照下标进行访问
					JSONObject jsonobject = (JSONObject)json.opt(i);
					strs += jsonobject.getString("name");
				}				
				
				Toast.makeText(getApplicationContext(), strs, Toast.LENGTH_LONG).show();
			}
			else{
				Toast.makeText(getApplicationContext(), "httperror", Toast.LENGTH_LONG).show();
			}
		}catch(Exception e){
			
			Log.v("test", "exception");
		}
	}

	
}

  

综上两种可以看出,其本质都是一样,一个JSONArray分成多个JSONObject进行操作。

顺便说下:

1、在Android 4.X中,进行网络访问时不要放在主线程里,否则APP可能会强制退出。

2、注意UI线程与非UI线程的区别。

3、Looper.prepare()与Looper.loop()的作用。

4、需要网络访问时,别忘了在mainfest里添加权限

<uses-permission android:name="android.permission.INTERNET"/>

5、小弟不才,如有错误,还请指出。

6、代码虽然是我写的,但是有问题尽量不要找我,是他自己长歪了。  

7、转载请注明出处。

_______________________________________________

utf-8无bom格式保存php文件(不要用windows自带记事本,可用notepad),否则可能导致解析错误。