您的位置:首页 > Web前端 > JavaScript

JSON数据的解析

2015-09-15 20:35 591 查看
JSON数据的解析

步骤:

1 设置网络权限

2 搭建布局文件,显示解析后的数据

3 声明控件,加载布局,找到id,创建进度框

4 创建异步加载类,模拟下载

5 获取网络权限

6 开始解析

源代码:

1 添加网络权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android_parserjson"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<!-- 添加网络权限 -->
<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.example.android_parserjson.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 搭建布局文件,显示解析后的数据

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Spinner
android:id="@+id/Spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>


3 声明控件,加载布局,找到id,创建进度框

package com.example.android_parserjson;

import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.view.Menu;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity {

/*
* 解析JSON数据 步骤:1 获取网络权限 2 搭建布局文件 3 声明控件,找到id 4 进度提示框 5 创建异步任务,模拟下载
*/
private Spinner spinner;// 声明显示json数据的控件
private ProgressDialog dialog;// 声明进度提示框控件
// 解析数据的地址
private static final String jsonPath = "http://sns.maimaicha.com/api?apikey=b4f4ee31a8b9acc866ef2afb754c33e6&format=json&method=news.getHeadlines&page=0&rows=15";
private MyAsyncTask myAsyncTask;// 声明异步任务对象

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);// 加载布局文件到逻辑代码中
spinner = (Spinner) findViewById(R.id.Spinner);// 找到控件id
dialog = new ProgressDialog(MainActivity.this);// 实例化进度对话框
new MyAsyncTask(dialog, MainActivity.this, spinner).execute(jsonPath);

}
}


4 创建异步加载类,模拟下载

package com.example.android_parserjson;

import java.util.List;

import android.R.integer;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

/**
* 异步加载步骤 1 创建一个类继承AsyncTask 2
* 实现AsyncTask的onPreExecute,doInBackground,onPostExecute方法
*
*/
// 参数Params:下载的数据的地址的类型
// 参数Progress:进度,无进度显示就下Void
// 参数Result:得到解析后的数据的类型
public class MyAsyncTask extends AsyncTask<String, Void, List<String>> {

private ProgressDialog dialog;
private Context context;
private Spinner spinner;

public MyAsyncTask(ProgressDialog dialog, Context context, Spinner spinner) {
super();
this.dialog = dialog;
this.context = context;
this.spinner = spinner;
}

// 首次调用的方法,工作在主线程,完成一些基本操作
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(context);// 初始化dialog
dialog.setTitle("下载JSON数据");// 标题
dialog.setMessage("正在下载.....");// 内容
dialog.setIcon(R.drawable.ic_launcher);// 图标
dialog.show();// 显示进度框
super.onPreExecute();
}

// 在后台进行耗时下载等耗时操作,工作在子线程
@Override
protected List<String> doInBackground(String... arg0) {
String jsonPath = arg0[0];// JSON数据的地址
String jsonString = HttpInternet.httpInternet(jsonPath);// 获取网络请求
List<String> list = ParserJson.parserIson(jsonString);//开始解析数据
return list;
}

// 接收doInBackground返回的数据
@Override
protected void onPostExecute(List<String> result) {
super.onPostExecute(result);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
android.R.layout.simple_list_item_1, result);
spinner.setAdapter(adapter);
dialog.dismiss();

}

}


5 获取网络权限

package com.example.android_parserjson;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.HttpConnection;

/**
* 获取网络请求
* 首先传入JSON数据的地址
*/
public class HttpInternet {

public static String httpInternet(String jsonPath){
ByteArrayOutputStream out=new ByteArrayOutputStream();//输出流,接收数据
String path="";
URL url;
try {
url=new URL(jsonPath);
HttpURLConnection  connection = (HttpURLConnection) url.openConnection();//打开连接
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.connect();
InputStream in = connection.getInputStream();
byte[] buffer=new byte[1024];
int temp=0;
while((temp=in.read(buffer))!=-1){
out.write(buffer, 0, temp);
out.flush();
}
return out.toString();
} catch (Exception e) {
e.printStackTrace();
}
return jsonPath;

}
}


6 开始解析

package com.example.android_parserjson;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

/*
* 开始解析数据
*/
public class ParserJson {

public static List<String> parserIson(String jsonString) {
List<String> list = new ArrayList<String>();// 存放解析后的数据
try {
JSONObject object1 = new JSONObject(jsonString);// {}表示对象
JSONArray array1 = object1.getJSONArray("data");// []表示数组
for (int i = 0; i < array1.length(); i++) {// 循环解析数组里多个对象
JSONObject object2 = array1.getJSONObject(i);
String name = object2.getString("title");// 得到内容
list.add(name);
}
} catch (Exception e) {

}

return list;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: