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>
(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 }}
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
- Android中对Json数据解析实例(网络访问的问题)
- Android中对json数据的解析
- android解析json数据的详解实例
- android对json数据的解析
- android对json数据解析的封装
- Android中发起网络访问的方式,以及Json、Gson的网络解析
- android解析网络json数据(1)
- android中对json的解析网址
- 网络访问之json数据解析
- 访问网络数据+json解析代码片段
- Android请求网络数据,json解析-FastJson遇到的问题 首字母大写问题
- android中对json解析(上传数据以及解析返回值)
- 记android学习之路----android中对json数据的解析
- get 方式 访问网络 得到返回数据 并对其json 解析
- android中json数据的解析
- Android中解析JSON形式的数据
- android中json数据的解析
- Android中解析JSON形式的数据
- 基于Android/机顶盒/pc高质量视频通话及手机直播源码转让
- 原来有种方法叫继承
- Android 测试 Appium、Robotium、monkey等框架或者工具对比
- ISE中FPGA的实现流程
- 公司项目总结
- Android中对Json数据解析实例(网络访问的问题)
- poj1222 EXTENDED LIGHTS OUT 高斯消元
- Zigbee协议栈中文说明
- 使用 Intel HAXM 为 Android 模拟器加速,媲美真机
- java获取泛型类型
- LAMP网站架构方案分析
- Hibernate学习笔记(4)Hibernate映射文件之many-to-many(多对多关联)
- json知识总结
- 【EL表达式】EL表达式入门