package com.example.hoteltest;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import android.util.Log;
public class JSON {
/**
* 獲取"數組形式"的JSON數據,
* 數據形式:[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]
* @param path 網頁路徑
* @return 返回List
* @throws Exception
*/
public static List<Map<String, String>> getJSONArray(String path) throws Exception {
String json = null;
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = null;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對象,我們可以從網絡中獲取網頁數據.
conn.setConnectTimeout(5 * 1000); // 單位是毫秒,設置超時時間為5秒
conn.setRequestMethod("GET"); // HttpURLConnection是通過HTTP協議請求path路徑的,所以需要設置請求方式,可以不設置,因為默認為GET
if (conn.getResponseCode() == 200) {// 判斷請求碼是否是200碼,否則失敗
InputStream is = conn.getInputStream(); // 獲取輸入流
byte[] data = readStream(is); // 把輸入流轉換成字符數組
json = new String(data); // 把字符數組轉換成字符串
//數據形式:[{"id":1,"name":"小豬","age":22},{"id":2,"name":"小貓","age":23}]
JSONArray jsonArray = new JSONArray(json); //數據直接為一個數組形式,所以可以直接 用android提供的框架JSONArray讀取JSON數據,轉換成Array
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject item = jsonArray.getJSONObject(i); //每條記錄又由幾個Object對象組成
int id = item.getInt("id"); // 獲取對象對應的值
String name = item.getString("name");
map = new HashMap<String, String>(); // 存放到MAP里面
map.put("id", id + "");
map.put("name", name);
list.add(map);
}
}
// ***********測試數據******************
for (Map<String, String> list2 : list) {
String id = list2.get("id");
String name = list2.get("name");
Log.i("abc", "id:" + id + " | name:" + name);
}
return list;
}
/**
* 獲取"對象形式"的JSON數據,
* 數據形式:{"total":2,"success":true,"arrayData":[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]}
* @param path 網頁路徑
* @return 返回List
* @throws Exception
*/
public static List<Map<String, String>> getJSONObject(String path) throws Exception {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = null;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對象,我們可以從網絡中獲取網頁數據.
conn.setConnectTimeout(5 * 1000); // 單位是毫秒,設置超時時間為5秒
conn.setRequestMethod("GET"); // HttpURLConnection是通過HTTP協議請求path路徑的,所以需要設置請求方式,可以不設置,因為默認為GET
if (conn.getResponseCode() == 200) {// 判斷請求碼是否是200碼,否則失敗
InputStream is = conn.getInputStream(); // 獲取輸入流
byte[] data = readStream(is); // 把輸入流轉換成字符數組
String json = new String(data); // 把字符數組轉換成字符串
//數據形式:{"total":2,"success":true,"arrayData":[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]}
JSONObject jsonObject=new JSONObject(json); //返回的數據形式是一個Object類型,所以可以直接轉換成一個Object
int page=jsonObject.getInt("page");
String type=jsonObject.getString("type");
Log.i("abc", "type:" + type + " |page:" + page); //測試數據
JSONArray jsonArray = jsonObject.getJSONArray("hotels");//里面有一個數組數據,可以用getJSONArray獲取數組
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject item = jsonArray.getJSONObject(i); // 得到每個對象
double distance=item.getDouble("distance");
String direction=item.getString("direction");
int star_rating=item.getInt("star_rating");
String name=item.getString("name");
double nightly_rate=item.getDouble("nightly_rate");
double promoted_nightly_rate=item.getDouble("promoted_nightly_rate");
double total_rate=item.getDouble("total_rate");
double longitude=item.getDouble("longitude");
String key=item.getString("key");
double promoted_total_rate=item.getDouble("promoted_total_rate");
String latitude=item.getString("latitude");
long master_id=item.getLong("master_id");
String thumbnail=item.getString("thumbnail");
String street_address=item.getString("street_address");
double review_score=item.getDouble("review_score");
map = new HashMap<String, String>(); // 存放到MAP里面
map.put("distance", distance + "");
map.put("direction", direction + "");
map.put("star_rating", star_rating + "");
map.put("name", name + "");
map.put("nightly_rate", nightly_rate + "");
map.put("promoted_nightly_rate", promoted_nightly_rate + "");
map.put("total_rate", total_rate + "");
map.put("key", key + "");
map.put("promoted_total_rate", promoted_total_rate + "");
map.put("latitude", latitude + "");
map.put("master_id", master_id + "");
map.put("thumbnail", thumbnail + "");
map.put("street_address", street_address + "");
map.put("review_score", review_score + "");
list.add(map);
}
}
// ***********測試數據******************
for (Map<String, String> list2 : list) {
String distance = list2.get("distance");
String direction = list2.get("direction");
String star_rating = list2.get("star_rating");
String name = list2.get("name");
String nightly_rate = list2.get("nightly_rate");
String promoted_nightly_rate = list2.get("promoted_nightly_rate");
String total_rate = list2.get("total_rate");
String key = list2.get("key");
String promoted_total_rate = list2.get("promoted_total_rate");
String latitude = list2.get("latitude");
String master_id = list2.get("master_id");
String thumbnail = list2.get("thumbnail");
String street_address = list2.get("street_address");
String review_score = list2.get("review_score");
System.out.println(distance);
System.out.println(direction);
System.out.println(star_rating);
System.out.println(name);
System.out.println(nightly_rate);
System.out.println(promoted_nightly_rate);
System.out.println(total_rate);
System.out.println(key);
System.out.println(promoted_total_rate);
System.out.println(latitude);
System.out.println(master_id);
System.out.println(thumbnail);
System.out.println(street_address);
System.out.println(review_score);
}
return list;
}
/**
* 獲取類型復雜的JSON數據
*數據形式:
{"name":"小豬",
"age":23,
"content":{"questionsTotal":2,
"questions": [ { "question": "what's your name?", "answer": "小豬"},{"question": "what's your age", "answer": "23"}]
}
}
* @param path 網頁路徑
* @return 返回List
* @throws Exception
*/
public static List<Map<String, String>> getJSON(String path) throws Exception {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = null;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對象,我們可以從網絡中獲取網頁數據.
conn.setConnectTimeout(5 * 1000); // 單位是毫秒,設置超時時間為5秒
conn.setRequestMethod("GET"); // HttpURLConnection是通過HTTP協議請求path路徑的,所以需要設置請求方式,可以不設置,因為默認為GET
if (conn.getResponseCode() == 200) {// 判斷請求碼是否是200碼,否則失敗
InputStream is = conn.getInputStream(); // 獲取輸入流
byte[] data = readStream(is); // 把輸入流轉換成字符數組
String json = new String(data); // 把字符數組轉換成字符串
/*數據形式:
{"name":"小豬",
"age":23,
"content":{"questionsTotal":2,
"questions": [ { "question": "what's your name?", "answer": "小豬"},{"question": "what's your age", "answer": "23"}]
}
}
*/
JSONObject jsonObject=new JSONObject(json); //返回的數據形式是一個Object類型,所以可以直接轉換成一個Object
String name=jsonObject.getString("name");
int age=jsonObject.getInt("age");
Log.i("abc", "name:" + name + " | age:" + age); //測試數據
JSONObject contentObject=jsonObject.getJSONObject("content"); //獲取對象中的對象
String questionsTotal=contentObject.getString("questionsTotal"); //獲取對象中的一個值
Log.i("abc", "questionsTotal:" + questionsTotal); //測試數據
JSONArray contentArray=contentObject.getJSONArray("questions"); //獲取對象中的數組
for (int i = 0; i < contentArray.length(); i++) {
JSONObject item = contentArray.getJSONObject(i); // 得到每個對象
String question = item.getString("question"); // 獲取對象對應的值
String answer = item.getString("answer");
map = new HashMap<String, String>(); // 存放到MAP里面
map.put("question", question);
map.put("answer", answer);
list.add(map);
}
}
// ***********測試數據******************
for (Map<String, String> list2 : list) {
String question = list2.get("question");
String answer = list2.get("answer");
Log.i("abc", "question:" + question + " | answer:" + answer);
}
return list;
}
/**
* 把輸入流轉換成字符數組
* @param inputStream 輸入流
* @return 字符數組
* @throws Exception
*/
public static byte[] readStream(InputStream inputStream) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
bout.write(buffer, 0, len);
}
bout.close();
inputStream.close();
return bout.toByteArray();
}
}