android通用JSON解析

来源:互联网 发布:计算机专业做数据分析 编辑:程序博客网 时间:2024/06/07 20:48
package cn.com.pcgroup.android.browser.module.onlineproduct;import java.io.IOException;import java.net.HttpURLConnection;import java.net.URL;import java.nio.ByteBuffer;import java.nio.channels.Channels;import java.nio.channels.ReadableByteChannel;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import org.json.JSONArray;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import cn.com.pcgroup.android.browser.R;public class Information extends Activity {private static final String baseUrl = "http://192.168.199.45/1.txt";private static final String TAG = Information.class.getSimpleName();private static LayoutInflater mInflater;private static String json;private Map<String, String> infoMap = new HashMap<String, String>();private static Map<Index, String> itemMap = new HashMap<Index, String>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.online_product_information);ListView list = (ListView) findViewById(R.id.list);mInflater = getWindow().getLayoutInflater();try {json = downloadJSON().get();Log.v(TAG, json);JSONObject jsonObject = new JSONObject(json);handleJson(jsonObject, infoMap);Index i = new Index();i.setKey("image");i.setPos(1);String result = itemMap.get(i);Log.v(TAG, "result = " + result);Log.v(TAG, "productId = " + infoMap.get("productId"));Log.v(TAG, "itemCount = " + itemCount);InforAdapter adapter = new InforAdapter(itemCount);list.setAdapter(adapter);} catch (Exception e) {throw new RuntimeException(e);}}private void handleJson(JSONObject jsonObject, Map<String, String> infoMap) {if (jsonObject == null || infoMap == null)return;@SuppressWarnings("unchecked")Iterator<String> it = jsonObject.keys();while (it.hasNext()) {String key = it.next();JSONArray array = jsonObject.optJSONArray(key);// 假如只是JSONObjectif (array == null)infoMap.put(key, jsonObject.optString(key));// 是JSONArray,则递归处理else {handleJsonArray(array, itemMap);}}}private static class Index {private int pos = 0;private String key = new String();public Index() {}public Index(int pos, String key) {this.pos = pos;this.key = key;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((key == null) ? 0 : key.hashCode());result = prime * result + pos;return result;}@Overridepublic boolean equals(Object obj) {if (obj == this)return true;if (obj instanceof Index)return ((Index) obj).pos == pos&& (((Index) obj).key).equals(key);return false;}public int getPos() {return pos;}public void setPos(int pos) {this.pos = pos;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}}private int itemCount = 0;private int handleJsonArray(JSONArray array, Map<Index, String> map) {if (array == null)return itemCount;int len = array.length();itemCount = len;for (int i = 0; i < len; i++) {JSONObject obj = (JSONObject) array.opt(i);@SuppressWarnings("unchecked")Iterator<String> it = obj.keys();while (it.hasNext()) {String key = it.next();JSONArray a = obj.optJSONArray(key);if (a != null)handleJsonArray(a, itemMap);else {Index index = new Index(i, key);itemMap.put(index, obj.optString(key));}}}return itemCount;}private static class InforAdapter extends BaseAdapter {private int count; // 有几条数据String[] sa = { "id", "title", "image", "channel" };public InforAdapter(int count) {this.count = count;}@Overridepublic int getCount() {return count;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = mInflater.inflate(R.layout.information_layout,null);}TextView t = (TextView) convertView.findViewById(R.id.text);t.setTextSize(20);Index i = new Index(position, "title");t.setText(itemMap.get(i));return convertView;}}@SuppressWarnings({ "finally", "unused" })private String getStringFromServer(final String url){ReadableByteChannel channel = null;StringBuilder sb = null;try {URL u = new URL(url);HttpURLConnection conn = (HttpURLConnection) u.openConnection();channel = Channels.newChannel(conn.getInputStream());ByteBuffer buffer = ByteBuffer.allocate(1024);sb = new StringBuilder();while(channel.read(buffer) != -1){buffer.flip();while(buffer.hasRemaining())sb.append((char)buffer.get());buffer.clear();}} catch (Exception e) {throw new RuntimeException(e);}finally{try {channel.close();} catch (IOException e) {e.printStackTrace();}finally{return sb.toString();}}}private Future<String> downloadJSON(){ExecutorService exec = Executors.newCachedThreadPool();class DownLoadTask implements Callable<String>{@SuppressWarnings("static-access")@Overridepublic String call() {json = OnlineApiService.getInstance(Information.this).getJSONString(baseUrl);return json;}}Future<String> future = exec.submit(new DownLoadTask());exec.shutdown();return future;}}

原创粉丝点击