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、转载请注明出处。

时间: 2024-10-23 05:13:54

Android 解析JSONObject以及JSONArray对比的相关文章

Gson解析JsonObject和JsonArray

http://www.cnblogs.com/codingyuan/p/5837663.html Gson中重要的几个核心类: Gson.JsonParser.JsonObject.JsonArray. 下面就是解析的步骤: public void parserJsonArray(String strJson){ //创建一个Gson对象 Gson gson = new Gson(); //创建一个JsonParser JsonParser parser = new JsonParser();

json原生解析jsonObject和jsonArray

public void jsonParse() throws JSONException{ String jsonStr = "{'name':'zhangsan','age':'19'}"; JSONObject jobj = new JSONObject(jsonStr); String name = jobj.getString("name"); // String age = jobj.getString("age"); int age

android解析JSON

一.解析JSON数据: 首先引入包import org.json.JSONObject;(android sdk 14以后应该自带了 ) JSON数据如:String strJson = {"sid":"2","name":"张三"}; Android端的程序处理解析: JSONObject userJObject = new JSONObject(strJson ); String name = userObject.get

android Json 解析 JSONObject JSONArray

android Json 解析  JSONObject JSONArray 我只解析了一个,不管有多少个都以此方法类推,加上http://blog.csdn.net/menglele1314/article/details/46324069里的JSONArray解析,可以应付一般所以的开发了 try { String value = "{\"result\":\"S\", \"address\":[{\"shengfen\&q

json 的解析-使用Android中的JSONObject和JSONArray解析json数据

1.代码 public class MainActivity extends Activity { TextView tv_json; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_json = (TextView) findViewById(R.id.tv_j

Android Bitmap 全面解析(四)图片处理效果对比 ...

对比对象: UIL Volley 官方教程中的方法(此系列教程一里介绍的,ImageLoader的处理方法和官方的差不多) ------------------------------------------------------------------------ 首先单张图片的压缩处理,也是分析重点 专门撸了一个小demo(结尾会放出下载连接)将对应计算方法copy了出来,然后计算了几十组数据,进行了对比 原图宽高都是一个10000以内的随机整数,限定大小是400 200,然后进行压缩处理

JSONObject和JSONArray解析和构造json字符串

JSON-lib包(最关键的两个类分别是JSONObject和JSONArray)完成对json的构造和一些基本方法的使用. 二者区别: ①JSONObject构造的字符串是键值对形式(key:value),多个键值对间以英文逗号连接: ②JSONArray构造的字符串是数组形式([array1,array2,...]). 需要使用的包下载链接:http://pan.baidu.com/s/1o7MZ8X8 一.JSONObject的使用. (1)JSON字符串的两种构造方法: ①使用Java对

Android解析

SAX解析 特点: 占用内存少,解析速度快 采用事件启动,不需要解析整个文档.而是按照内容顺序 看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法定义在ContentHandler中 1 解析类AtomParser extends DefaultHandler 2 startDocument:当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作 startElement: (String namespaceURI,

Android 解析json数据

1.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(网络传输速度