閱讀624 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android中數據文件解析(Json解析)

首先說一下Json數據的最基本的特點,Json數據是一係列的鍵值對的集合,和XML數據來比,Json數據的體積更加小,傳輸效率高,易解析,不過可讀性不高;

      因為這次要從服務器端得到Json數據,並且通過解析之後把解析後的數據顯示在Android客戶端中,首先部署服務器端代碼(直接使用Jsp/Servlet):

       構造的Json數據如下:

     [{"name":"張三","address":"北京","age":20},{"name":"李四","address":"上海","age":30},{"name":"王五","address":"深圳","age":35}]


[一]服務器端(Person.java省略):

     ①:數據構造JsonService.java

public class JsonService {
public static List<Person> getListPerson() {
List<Person> mLists = new ArrayList<Person>();
mLists.add(new Person("張三", "北京", 20));
mLists.add(new Person("李四", "上海", 30));
mLists.add(new Person("王五", "深圳", 35));
return mLists;
}
②:Servlet的代碼(包括構造Json數據,沒有使用Json數據轉換方法)JsonServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
List<Person> persons = JsonService.getListPerson();
StringBuffer sb = new StringBuffer();
sb.append('[');
for (Person person : persons) {
sb.append('{').append("\"name\":").append("\""+person.getName()+"\"").append(
",");
sb.append("\"address\":").append("\""+person.getAddress()+"\"").append(",");
sb.append("\"age\":").append(person.getAge());
sb.append('}').append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(']');
out.write(new String(sb));
out.flush();
out.close();
}


  ③:部署到Tomact 瀏覽器輸入https://localhost/JsonWeb/JsonServlet直接訪問結果如下:

       至此服務器端代碼編碼完成,下麵進行客戶端代碼編寫;
  
  (二)客戶端(Person類,和展示數據的布局文件因為簡單省去)


      ①:獲取服務器端的Json數據並且解析的工具類JsonParse.java


  必要的需要導入的包省去   
public class JsonParse {
/**
* 解析Json數據
* 
* @param urlPath
* @return mlists
* @throws Exception
*/
public static List<Person> getListPerson(String urlPath) throws Exception {
List<Person> mlists = new ArrayList<Person>();
byte[] data = readParse(urlPath);
JSONArray array = new JSONArray(new String(data));
for (int i = 0; i < array.length(); i++) {
JSONObject item = array.getJSONObject(i);
String name = item.getString("name");
String address = item.getString("address");
int age = item.getInt("age");
mlists.add(new Person(name, address, age));
}
return mlists;
}
/**
* 從指定的url中獲取字節數組
* 
* @param urlPath
* @return 字節數組
* @throws Exception
*/
public static byte[] readParse(String urlPath) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream inStream = conn.getInputStream();
while ((len = inStream.read(data)) != -1) {
outStream.write(data, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}

②:主Activity類

public class MainActivity extends Activity {
private Button mButton;
private ListView mListView;
//使用IP不能使用localhost或者127.0.0.1,因為android模擬器默認綁定這個IP,這裏應該訪問局域網IP
private static final String urlPath = "https://10.16.31.207/JsonWeb/JsonServlet";
private static final String TAG = "MainActivity";
private List<Person> persons;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button) findViewById(R.id.button1);
mListView = (ListView) findViewById(R.id.listView1);
mButton.setOnClickListener(new MyOnClickListener());
}

private class MyOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
try {
// 得到Json解析成功之後數據
persons = JsonParse.getListPerson(urlPath);
List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < persons.size(); i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("name", persons.get(i).getName());
map.put("address", persons.get(i).getAddress());
map.put("age", persons.get(i).getAge());
data.add(map);
}
//初始化適配器,並且綁定數據
SimpleAdapter _Adapter = new SimpleAdapter(MainActivity.this,
data, R.layout.listview_item, new String[] { "name",
"address", "age" }, new int[] { R.id.textView1,
R.id.textView2, R.id.textView3 });
mListView.setAdapter(_Adapter);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "解析失敗", 2000).show();
Log.i(TAG, e.toString());

}
}
}


最後更新:2017-04-02 17:51:23

  上一篇:go Android實戰技巧:如何在ListView中嵌套ListView
  下一篇:go Android 創建與解析XML(六)—— 比較與使用