zoukankan      html  css  js  c++  java
  • Android 解析JSONObject以及JSONArray对比

    在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),否则可能导致解析错误。

  • 相关阅读:
    第一次冲刺02
    第一次冲刺01
    Android源码分析(十四)PackageManagerService服务分析
    Android源码分析(十三)ActivityManagerService服务分析
    Android源码分析(十二)ServiceManager服务分析
    Serializable和Parcelable之序列化
    ViewPager 相关使用
    AIDL介绍以及简单使用
    Android 四大组件 (五) 第五大组件
    Android 源码分析(十一) 事件传递机制
  • 原文地址:https://www.cnblogs.com/hearzeus/p/4099587.html
Copyright © 2011-2022 走看看