首页 > 代码库 > Android 解析JSONObject以及JSONArray对比
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/15package 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/15package 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、转载请注明出处。
Android 解析JSONObject以及JSONArray对比
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。