Android中对Json数据解析实例(网络访问的问题)

来源:互联网 发布:流道ug编程3种方法 编辑:程序博客网 时间:2024/06/05 21:57

转载请注明出处,谢谢!
http://blog.csdn.net/alantang1990


目的:在Android客户端解析Json数据时,从网络端服务器获取Json数据,然后在日志中打印出来
下面用一个实例来说明
解析网址:http://www.weather.com.cn/data/sk/101230201.html
要求:解析上面网址中的天气数据

关于Json的有关内容概述
参考:http://www.open-open.com/lib/view/open1326376799874.html

Json详细概述(引自老罗Android开发)
JSON数据格式的定义
Json的全称:JavaScript Object NotationJson建构于两种结构:“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)

JSON对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。
每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

如: { “name”:”jackson”, “age”:100 }  




数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔
如:{ “students”: [ {“name”:”jackson”,“age”:100}, {“name”:”michael”,”age”:51} ] }



下面进行解析的实际编码操作


1、首先在Manifest中添加网络访问权限

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.alan.android_json" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="18" /> <!-- 添加网络访问授权 --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.alan.android_json.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>


2、编写客户端XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/weatherinfo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/weather" /> </LinearLayout>

3、src文件编写


(1)首先既然是从网络中获取Json数据,当然要访问网络,在此我们需要编写一个关于请求网络服务的工具类 HttpUtils
HttpUtils.java

package com.alan.android_json.http;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.util.Log;//HTTP工具类public class HttpUtils { public HttpUtils() {  // TODO Auto-generated constructor stub }    public static String getJsonContent(String url_path){     try {   URL url = new URL(url_path);   HttpURLConnection connection = (HttpURLConnection) url.openConnection();    connection.setConnectTimeout(3000);     connection.setRequestMethod("GET");//请求方法      connection.setDoInput(true);//输入流    int code = connection.getResponseCode();      if(code == 200){//服务器已准备好,可以取出流,流直接转换成字符串          return ChangeInputStream(connection.getInputStream());   }      } catch (Exception e) {   // TODO: handle exception  }     return "";    } private static String ChangeInputStream(InputStream inputStream) {  // TODO Auto-generated method stub  String jsonString = "";  //字节数组流,表示在内存地址当中可以显示出来,可以把数据写入内存当中  ByteArrayOutputStream outputStream = new ByteArrayOutputStream();  int len = 0;  byte[] data = new byte[1024];   try {   while ((len = inputStream.read(data))!=-1){    outputStream.write(data, 0, len);   }      //outputStream流——>写入ByteArrayOutputStream——>转换成字节数组   jsonString = new String(outputStream.toByteArray());     } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }      return jsonString; }}
(2)既然需要解析服务器上的天气信息,那么对天气信息这个对象需要建立一个实体类,对其中的值进行获取
WeatherInfo.java
package com.alan.android_json.domain;/** * @author Alan * */public class WeatherInfo { private String city; private String cityid; private String temp; private String WD; private String WS; private String SD; private String WSE; private String time; private String isRadar; private String Radar; @Override    public String toString() {     // TODO Auto-generated method stub     return "WeatherInfo [city= "+ city +",cityid="+ cityid +",temp="+ temp +"," +       "WD="+ WD +",WS="+ WS +",SD="+ SD +",WSE="+ WSE +",time="+ time +",isRadar="+ isRadar +",Radar="+ Radar +"]";    } public String getCity() {  return city; } public void setCity(String city) {  this.city = city; } public String getWS() {  return WS; } public void setWS(String wS) {  WS = wS; } public String getCityid() {  return cityid; } public void setCityid(String cityid) {  this.cityid = cityid; } public String getTemp() {  return temp; } public void setTemp(String temp) {  this.temp = temp; } public String getWD() {  return WD; } public void setWD(String wD) {  WD = wD; } public String getSD() {  return SD; } public void setSD(String sD) {  SD = sD; } public String getWSE() {  return WSE; } public void setWSE(String wSE) {  WSE = wSE; } public String getTime() {  return time; } public void setTime(String time) {  this.time = time; } public String getIsRadar() {  return isRadar; } public void setIsRadar(String isRadar) {  this.isRadar = isRadar; } public String getRadar() {  return Radar; } public void setRadar(String radar) {  Radar = radar; } public WeatherInfo() {  // TODO Auto-generated constructor stub }}

(3)实体类已编写好,下一步就是编写解析Json数据的工具

JsonTools.java

package com.alan.android_json.json;import org.json.JSONObject;import com.alan.android_json.domain.WeatherInfo;/** * 完成对Json数据的解析 *  * @author Alan *  */public class JsonTools { public JsonTools() {  // TODO Auto-generated constructor stub } public static WeatherInfo getWeatherInfo(String key, String jsonString) {  WeatherInfo weatherinfo = new WeatherInfo();  try {   JSONObject jsonObject = new JSONObject(jsonString);   //取出key   JSONObject weatherinfoObject = jsonObject.getJSONObject("weatherinfo");      weatherinfo.setCity(weatherinfoObject.getString("city"));   weatherinfo.setCityid(weatherinfoObject.getString("cityid"));   weatherinfo.setTemp(weatherinfoObject.getString("temp"));   weatherinfo.setWD(weatherinfoObject.getString("WD"));   weatherinfo.setWS(weatherinfoObject.getString("WS"));   weatherinfo.setSD(weatherinfoObject.getString("SD"));   weatherinfo.setWSE(weatherinfoObject.getString("WSE"));   weatherinfo.setTime(weatherinfoObject.getString("time"));   weatherinfo.setIsRadar(weatherinfoObject.getString("isRadar"));   weatherinfo.setRadar(weatherinfoObject.getString("Radar"));     } catch (Exception e) {   // TODO: handle exception  }  return weatherinfo; }}

(4)万事俱备,只欠东风了,对于主Activity的编写!

这里也是我这次着重想说的一个内容,就是关于在主线程中网络访问的问题!

         首先

       URL url = new URL(path);

      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

       执行此方法用来开辟一个URL请求

    该请求在Android4.0版本以后需要放到子线程中实现,主线程已不支持httprequest请求(android2.3仍然支持此项)

在开始写MainActivity时,由于把执行操作放到了主线程中,导致Logcat中打印不出来获取的Json的值,必须把网络的操作放到子线程中才行



MainActivity.java
<span style="color:#003300;">package com.alan.android_json;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.alan.android_json.domain.WeatherInfo;import com.alan.android_json.http.HttpUtils;import com.alan.android_json.json.JsonTools;/*** @author Alan**/public class MainActivity extends Activity implements OnClickListener{Mythread mythread;//对象实例化private Button weatherinfo;private String path = "http://www.weather.com.cn/data/sk/101230201.html";private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);weatherinfo = (Button)this.findViewById(R.id.weatherinfo);weatherinfo.setOnClickListener(this);mythread=new Mythread();mythread.start();}class Mythread extends Thread{public Handler mhandler;public void run(){Looper.prepare();mhandler=new Handler(){@Overridepublic void handleMessage(Message msg) {if(msg.what==0x123){String jsonString = HttpUtils.getJsonContent(path);WeatherInfo weatherinfo = JsonTools.getWeatherInfo("weatherinfo", jsonString);Log.i(TAG, weatherinfo.toString());}}};Looper.loop();}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubMessage msg=new Message();msg.what=0x123;mythread.mhandler.sendMessage(msg);}}</span>


(5)执行情况



源码下载
0 0
原创粉丝点击