1. 程式人生 > >【Android 開發】: Android客戶端與服務端之間使用GSON互動資料。

【Android 開發】: Android客戶端與服務端之間使用GSON互動資料。

    前面我們有提到google的Gson技術的介紹[GSON 資料格式詳解],這一講我們來詳細學習一下Android客戶端與服務端之間使用GSON進行JSON資料的解析,關於GSON的技術我們已經在前面兩講中提到過,對GSON不瞭解的讀者可以先去看前面兩講的博文,這一講我們主要學習一下使用GSON方式來完成Android客戶端與服務端之間的JSON資料的互動,具體的實現Demo我們會在上面一講[Android客戶端與服務端之間使用JSON互動資料]的Demo架構上進行修改,讀者在看這一部分的內容的時候可以從上面一講中看起。

    這一講我們主要來實現一下使用Gson完成JSON字串與Java物件之間的轉換,如下圖所示

一. 服務端:作用是使用GSON將服務端的物件轉換成JSON資料格式

我們服務端主要是基於上一講的解析JSON的服務端架構進行修改,讀者可以先看完上一講內容再參考此文。

1. 新增gson的jar庫到lib目錄下
2. 檢視GSON API com.google.gson.Gson類,這個是最經常使用的類

This is the main class for using Gson. Gson is typically used by first constructing a Gson instance and then invoking toJson(Object) or fromJson(String, Class) methods on it. 

3. 程式碼如下

1). JSONTools.java 上進行修改,修改如下所示

    /**
     * @param value :JSON 名值對中的值,值可以有多種型別
     * @return
     */
    // 使用Gson方式接受物件轉換為JSON資料格式並且作為字串輸出.
    public static String createJsonString(Object value){
        Gson gson = new Gson();
        String str = gson.toJson(value);
        return str;
    } 

   這邊做這個修改主要是因為在GSON中將Java物件轉換成JSON字串的時候是不帶key的值,這一點與上一講中講JSON字串的形式是不一樣的

2). 在JsonAction.java 上做對應的呼叫修改

        // 根據不同的引數輸出不同的JSON資料
        String jsonString = "";
        String action_flag = request.getParameter("action_flag");
        if(action_flag.equals("person")) {
            jsonString = JsonTools.createJsonString(service.getPerson());
        } else if(action_flag.equals("persons")){
            jsonString = JsonTools.createJsonString(service.getListPerson());
        } else if(action_flag.equals("listString")) {
            jsonString = JsonTools.createJsonString(service.getListString());
        } else if(action_flag.equals("listMap")){
            jsonString = JsonTools.createJsonString(service.getListMaps());
        }

3). 在瀏覽器位址列中訪問檢視是否返回JSON資料,下面就貼出一個例子,另外幾個讀者可以自己參考根據引數的不同去嘗試。

位址列輸入:http://192.168.0.112:8080/JsonProject/servlet/JsonAction?action_flag=listMap
返回:[{"id":1,"color":"red","name":"Polu"},{"id":7,"color":"green","name":"Zark"}]

說明服務端的使用GSON將物件轉換成JSON資料格式成功了

二. 客戶端:工作是利用GSON將服務端轉換好的JSON字串轉換成指定的物件。

1. 匯入gson庫

這裡有一個簡單的方法構建jar庫,在專案工程上右擊 --> new --> Folder --> 取名libs,然後將gson的jar包複製進去(如果已經存在libs資料夾則直接複製進去)然後選中所有匯入的jar包右擊 --> Build Path --> Add to Build Path 即可。

2. 程式Demo

1). GsonTools.java

package com.android.gsonproject.gson;

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

import com.google.gson.Gson;
import com.google.gson.reflect.*;
public class GsonTools {

    public GsonTools() {
    
    }

    /*
     * 檢視Gson api其中的fromJson(String json, Class<T> classOfT)方法
     * public <T> T fromJson(String json, Class<T> classOfT)
     * 用來描述一個特殊的Json物件,使用反射機制可以將JSON字串中包含的內容賦值給指定的類。這邊的T表示的是通過泛型,也就是可以表示任意的型別。
     * 引數說明:
     * json : 指定物件解析過的JSON字串源,用來轉換回Java物件。
     * classOfT : 泛型   T 的Class物件。
     */
    public static <T> T getPerson(String jsonString, Class<T> cls){
        T t = null;
        try {
            Gson gson = new Gson();
            t = gson.fromJson(jsonString, cls);
        } catch (Exception e) {
            // TODO: handle exception
        }
        return t;
    }
    
    /*
     * List 我們使用的Gson中的
     * public <T> T fromJson(String json, Type typeOfT)
     * 這邊我們需要取到List<T>中不同的物件,普通的實現方式就如上一講中org.Json庫來解析JSON的方式一樣(讀者閱讀上一講內容),
     * 這裡我們通過 Gson中的 TypeToken類是簡便操作:這邊typeOfT的用法是通過反射機制把T裡面的物件的屬性的值映射出來,然後通過將json字串取得的值賦值上去就可以了。
     * getType()的意思就是表示將jsonString的字串解析出來之後封裝到List集合中,然後分別從T裡面取出型別將其複製。
     */
    
    public static <T> List<T> getPersons(String jsonString, Class<T> cls){
        List<T> list = new ArrayList<T>();
        try {
            Gson gson = new Gson();
            list = gson.fromJson(jsonString, 
                    new TypeToken<List<T>>(){}.getType());
        } catch (Exception e) {
            // TODO: handle exception
        }
        return list;
    }
    
    public static List<String> getList(String jsonString){
        List<String> list = new ArrayList<String>();
        try {
            Gson gson = new Gson();
            list = gson.fromJson(jsonString, 
                    new TypeToken<List<String>>(){}.getType());
        } catch (Exception e) {
            // TODO: handle exception
        }
        return list;
    }
    
    public static List<Map<String, Object>> getListMaps(String jsonString){
        List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
        try {
            Gson gson = new Gson();
            list = gson.fromJson(jsonString, 
                    new TypeToken<List<Map<String, Object>>>(){}.getType());
        } catch (Exception e) {
            // TODO: handle exception
        }
        return list;
    }
}
2). MainActivity.java
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.person:
                String path = "http://192.168.0.112:8080/JsonProject/servlet/JsonAction?action_flag=person";
                String jsonString = HttpUtils.getJsonContent(path);
                Log.i(TAG, "The jsonString:" + jsonString);
                Person person = GsonTools.getPerson(jsonString, Person.class);
                Log.i(TAG, "The person:" + person.toString());
                break;

            case R.id.persons:
                String path2 = "http://192.168.0.112:8080/JsonProject/servlet/JsonAction?action_flag=persons";
                String jsonStr2 = HttpUtils.getJsonContent(path2);
                Log.i(TAG, "The jsonString:" + jsonStr2);
                List<Person> list = GsonTools.getPersons(jsonStr2, Person.class);
                Log.i(TAG, "The person:" + list.toString());
                break;
                
            case R.id.liststring:
                String path3 = "http://192.168.0.112:8080/JsonProject/servlet/JsonAction?action_flag=listString";
                String jsonStr3 = HttpUtils.getJsonContent(path3);
                Log.i(TAG, "The jsonString:" + jsonStr3);
                List<String> list3 = GsonTools.getList(jsonStr3);
                Log.i(TAG, "The person:" + list3.toString());
                break;
                
            case R.id.listmap:
                String path4 = "http://192.168.0.112:8080/JsonProject/servlet/JsonAction?action_flag=listMap";
                String jsonStr4 = HttpUtils.getJsonContent(path4);
                Log.i(TAG, "The jsonString:" + jsonStr4);
                List<Map<String, Object>> list4 = GsonTools.getListMaps(jsonStr4);
                Log.i(TAG, "The person:" + list4.toString());
                break;
        }
    }

3. [備註知識]

我們這裡使用的Class<T>是一個什麼概念?

  老羅的說法:由於服務端和客戶端所解析的物件雖然是一致的,但是必須要滿足不管服務端傳遞什麼物件,客戶端只要知道服務端傳遞的物件型別,就可以解析出來的。(他的表述我聽的很混)

  我自己的理解:Android客戶端需要解析服務端的不同型別的物件,所以這邊使用泛型來表示,而無論一個類new出多少個物件,它們對應的class物件是一致的(這點是Java的反射機制決定的),而Gson也運用了Java的反射機制,所以這邊的 classOfT引數的意思是 T型別的class物件。

四. 編譯執行結果

1. 介面如下所示

2. 第一個按鈕

3. 第二個按鈕

4. 第三個按鈕


5. 第四個按鈕

   由於整個工程都是基於上一講Json資料解析來修改和串講的,讀者在單獨看這一部分的內容會有迷糊,建議讀者可以閱讀上一篇博文,然後在看Gson的資料解析這樣效果會好很多。

在這裡貼出本文的原始碼:

客戶端:http://download.csdn.net/my

服務端:http://download.csdn.net/my



相關推薦

Android 開發: Android客戶服務之間使用JSON互動資料

    在前面的兩講中,我們講解了JSON資料格式的一些基本知識,以及做一些小Demo,這一講我們在前面的基礎上來做一個綜合的可擴充套件的Demo,主要是針對Android客戶端解析服務端傳遞過來的JSON資料。整個Demo所作的操作如下圖所示 1. 服務端    服務端

Android 開發: Android客戶服務之間使用GSON互動資料

    前面我們有提到google的Gson技術的介紹[GSON 資料格式詳解],這一講我們來詳細學習一下Android客戶端與服務端之間使用GSON進行JSON資料的解析,關於GSON的技術我們已經在前面兩講中提到過,對GSON不瞭解的讀者可以先去看前面兩講的博文,這一講

Android 開發: Android 訊息處理機制之一: Handler Message

    最近幾講內容,我們學習了Android中關於多執行緒的一些知識,上一講我們講解了非同步任務 AsyncTask 的操作,Android中還提供了其他的執行緒操作,如Handler Message MessageQueue Looper 等模組,這些就是Android

Android開發訊息提示框對話方塊-使用Toast顯示訊息提示框

在前面的例項中,已經應用過Toast類來顯示一個簡單的提示框了。這次將對Toast進行詳細介紹。Toast類用於在螢幕中顯示一個訊息提示框,該訊息提示框沒有任何控制按鈕,並且不會獲得焦點,經過一段時間後自動消失。通常用於顯示一些快速提示資訊,應用範圍非常廣泛。 使用Toas

文件下載之斷點續傳(客戶服務的實現)

http協議 當前時間 end box [] ada demo 服務端 sem 【轉】文件下載之斷點續傳(客戶端與服務端的實現) 【轉】文件下載之斷點續傳(客戶端與服務端的實現) 前面講了文件的上傳,今天來聊聊文件的下載。 老規矩,還是從最簡單粗暴的開始。那麽多簡單算簡單

Android開發Android 刪除指定檔案和資料

/** * 刪除單個檔案 * @param filePath 被刪除檔案的檔名 * @return 檔案刪除成功返回true,否則返回false */ public boolean deleteFile(String filePath) {

Android 開發: Android 訊息處理機制之四: Android 訊息迴圈 Looper 及其原始碼解析

  上一講我們學習Handler和Message的一些使用方式,我們知道Handler它會發送訊息和處理訊息,並且關聯一個子執行緒,如何傳送訊息入隊和出隊處理訊息等這些都是交給Looper去管理分發的,也就是它是負責整個訊息佇列運轉的一個類,這一講我們就來學習一下Andr

android學習筆記之客戶服務保持session登入狀態

剛進公司不久,也沒有具體專案任務,只有一個混合開發模式,使用AppCan開發的專案。 雖然混合開發很便捷、很高效,使用html和js就可以完成。 但我依然對android原生開發有著極高的熱情,尤其是在體驗了Android 5.0版本之後,更是對原生體驗著迷。 所以,我利用

Android 開發: Android 訊息處理機制之三: Handler 中 sendMessage() 原始碼剖析

  閱讀此文,請先閱讀以下相關連線: sendMessage()的幾種過載方法的使用方式的不同以及它們的原始碼的剖析.   通過前面幾講的內容,我們知道Android不但可以使用非同步任務處理多執行

敏捷開發Android團隊開發規範

  這裡說的開發規範分成目錄規範,專案和包名的命名規範,類,方法,變數和常量的命名規範這幾種。 目錄規範   目錄規範——在開發中整體資料夾組織結構。 Requirement——需求文件資料夾 Design——設計文件資料夾 Test——整合測試,系統測試,測試報告,測試清單資料夾 Deplo

Android開發Android跨程序通訊(AIDL)官方文件及官方Demo講解

第一章、 關於Android跨程序的思考 先來回顧一下作業系統中的一些概念。  同一個程序中可以有多個執行緒,執行緒間通訊可以直接取得地址。因為Java程式的記憶體分配在連續的地址空間。  預設一個Java程式會開啟一個程序,執行在JVM中。但

Android服務基於TCP/IP協議的Socket通訊

什麼是TCP/IP協議? 百度百科的解釋:Transmission Control Protocol/Internet Protocol的簡寫,中譯名為傳輸控制協議/因特網互聯協議,又名網路通訊協議,是Internet最基本的協議、Internet國

web開發關於EL表示式引數傳遞

spring專案中,下面兩個html標籤語句是有區別的:<input type="hidden" id="id" name="id" value=${user.id }> 以及<in

android移動服務通訊保持Session會話

移動端在向伺服器請求登入並且登入成功的時候,伺服器的訂單介面需要獲取當前登入的Session,才能夠以當前使用者身份下單,與web端不同,移動端的Session不會自動儲存到web端,每次請求都認為是一次新的請求。因此在移動端只要獲取到當前登入的Session並且記錄下來,在

Python socket編程客戶服務通信

eve sock 系統 con conn 綁定 idt 註意 服務 [本文出自天外歸雲的博客園] 目標:實現客戶端與服務端的socket通信,消息傳輸。 客戶端 客戶端代碼: from socket import socket,AF_INET,SOCK_STRE

Netty入門之客戶服務通信(二)

ktr 數據格式 lis boot ride owa 參數 val cef Netty入門之客戶端與服務端通信(二) 一.簡介   在上一篇博文中筆者寫了關於Netty入門級的Hello World程序。書接上回,本博文是關於客戶端與服務端的通信,感覺也沒什麽好說的了,直接

python---》客戶服務的基礎(做一個簡單的客戶服務

python 今天我們分享的內容是python簡單的客戶端與服務端,此處僅介紹一些簡單的函數,並作出來一個玩兒玩兒。 在開始之前呢,先用一張圖表示他們之間的關系 我們來按照這個步伐依次介紹:服務端:import socketserver=socket.socket()#此處是為了創建

python--》客戶服務文件的下載

python在介紹之前,我們需要了解一個加密算法 MD5 校驗和(checksum)通過對接收的傳輸數據執行散列運算來檢查數據的正確性。計算出的散列值拿來和隨數據傳輸的散列值比較。如果兩個值相同,說明傳輸的數據完整無誤、沒有被竄改過(前提是散列值沒有被竄改),從而可以放心使用。 如

基於socket.io客戶服務的相互通訊

dem send ins 返回 on() .com cal selector req socket.io是對websocket的封裝,用於客戶端與服務端的相互通訊。官網:https://socket.io/。 下面是socket.io的用法: 1、由於使用express

ssl客戶服務通信的demo

html 運用 types.h 數據 rom Go LG 使用 line 服務端程序流程 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <errno.h