我的Android進(jìn)階之旅------>android如何將List<NameValuePair>請(qǐng)求參數(shù)列表轉(zhuǎn)換為json格式

前言

由于接收原來(lái)的老項(xiàng)目并進(jìn)行維護(hù),之前的http請(qǐng)求是使用Apache Jakarta Common下的子項(xiàng)目HttpClient蜘腌,因此使用了 List<NameValuePair> 方式來(lái)創(chuàng)建參數(shù)隊(duì)列必盖,然后通過(guò)一個(gè)字符串處理的工具類拌牲,生成的post請(qǐng)求體格式大致如:

a=b&c=d&e=f

但是由于服務(wù)器api變更俱饿,需要將請(qǐng)求體的格式變成json格式,因此上面的請(qǐng)求參數(shù)要變成:

{"a":"b","c":"d","e":"f"}

但是如果將List<NameValuePair>直接通過(guò)Jackson或者Gson等第三方工具的轉(zhuǎn)json的開(kāi)源類庫(kù)去轉(zhuǎn)換為json格式的話塌忽,轉(zhuǎn)出來(lái)的json格式如:

[{"name":"a","value":"b"},{"name":"c","value":"d"},{"name":"e","value":"f"}]

如下面代碼所示:

    public class RequestParams {
        /**請(qǐng)求地址*/
        public String url;
        /**請(qǐng)求參數(shù)集合*/
        public List<NameValuePair> params;
    }

    /**
     * 帳號(hào)登錄
     *
     * @param userName 賬號(hào)名
     * @param password 密碼
     * @param days     記住密碼天數(shù):days>0定期超時(shí)拍埠;days=-2永不失效;
     *                 days=-1永久記住密碼(30天沒(méi)有操作則失效)
     * @param deviceId 賬戶在設(shè)備上的唯一標(biāo)識(shí)符(機(jī)器碼或mac地址)
     * @param appId    應(yīng)用id
     * @return
     */
    public static RequestParams loginParams(String userName, String password, int days, String deviceId, int appId) {
        RequestParams params = new RequestParams();
        params.url = LOGIN_URI;
        params.params = new ArrayList<NameValuePair>();
        params.params.add(new BasicNameValuePair("userName", userName));
        params.params.add(new BasicNameValuePair("password", password));
        params.params.add(new BasicNameValuePair("days", String.valueOf(days)));
        params.params.add(new BasicNameValuePair("deviceId", deviceId));
        params.params.add(new BasicNameValuePair("appId", String.valueOf(appId)));
        params = addcommonParams(params, LOGIN_URI, appId);
        return params;
    }

在請(qǐng)求的時(shí)候土居,將List<NameValuePair> params取出來(lái)枣购,然后使用JSONUtil工具類轉(zhuǎn)換成json格式,代碼如下所示:

    String request=JSONUtil.toJSON(requestParams.params);

其中換成json格式的工具類JSONUtil,該工具類使用了jackjson的第三方j(luò)son解析庫(kù)装盯,代碼如下所示:

    import android.util.Log;
    
    import com.fasterxml.jackson.annotation.JsonInclude.Include;
    import com.fasterxml.jackson.core.JsonGenerationException;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.IOException;
    import java.io.StringWriter;
    import java.io.Writer;
    
    /**
     * JSON轉(zhuǎn)換工具類
     *
     * @author  OuyangPeng
     * @version [1.0.0.0, 2016-3-23]
     */
    public class JSONUtil {
    
        private static String TAG = JSONUtil.class.getName();
    
        private static ObjectMapper mapper = new ObjectMapper();
    
        static {
            //對(duì)于為null的字段不進(jìn)行序列化
            mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
            //對(duì)于未知屬性不進(jìn)行反序列化
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            //無(wú)論對(duì)象中的值只有不為null的才進(jìn)行序列化
            mapper.setSerializationInclusion(Include.NON_NULL);
        }
    
        /**
         * 把對(duì)象轉(zhuǎn)化成json字符串
         *
         * @param obj
         * @return
         */
        public static String toJSON(Object obj) {
            if (obj == null) {
                return null;
            }
    
            Writer write = new StringWriter();
            try {
                mapper.writeValue(write, obj);
            } catch (JsonGenerationException e) {
                Log.e(TAG, e.toString() + obj);
            } catch (JsonMappingException e) {
                Log.e(TAG, e.toString() + obj);
            } catch (IOException e) {
                Log.e(TAG, e.toString() + obj);
            }
            return write.toString();
        }
    
        /**
         * JSON字符串轉(zhuǎn)成對(duì)象
         *
         * @param jsonStr
         * @param classType
         * @return
         */
        public static <T> T fromJSON(String jsonStr, Class<T> classType) {
            if (isEmptyOrNull(jsonStr)) {
                return null;
            }
    
            T t = null;
            try {
                t = mapper.readValue(jsonStr.getBytes("utf-8"), classType);
            } catch (JsonParseException e) {
                Log.e(TAG, e.toString() + ", jsonStr:" + jsonStr + ", classType:" + classType.getName());
            } catch (JsonMappingException e) {
                Log.e(TAG, e.toString() + ", jsonStr:" + jsonStr + ", classType:" + classType.getName());
            } catch (IOException e) {
                Log.e(TAG, e.toString() + ", jsonStr:" + jsonStr + ", classType:" + classType.getName());
            }
            return t;
        }
    
        /**
         * JSON字符串轉(zhuǎn)化成集合
         *
         * @param jsonStr
         * @return
         */
        public static <T> T toCollection(String jsonStr, Class<?> collectionClass, Class<?>... elementClasses) {
            if (isEmptyOrNull(jsonStr)) {
                return null;
            }
    
            T t = null;
            try {
                t = mapper.readValue(jsonStr.getBytes("utf-8")
                        , mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses));
            } catch (JsonParseException e) {
                e.printStackTrace();
                Log.e(TAG, e.toString() + ", jsonStr:" + jsonStr);
            } catch (JsonMappingException e) {
                e.printStackTrace();
                Log.e(TAG, e.toString() + ", jsonStr:" + jsonStr);
            } catch (IOException e) {
                Log.e(TAG, e.toString() + ", jsonStr:" + jsonStr);
            }
            return t;
        }
    
        public static Object get(String jsonStr, String key) {
            Object obj = null;
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);
                obj = jsonObj.get(key);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return obj;
        }
    
        /**
         * 判斷字符串是否為null或者""
         */
        public static boolean isEmptyOrNull(String content) {
            if (content == null || content.equals("")) {
                return true;
            }
            return false;
        }
    }

使用上面的代碼將List<NameValuePair> params請(qǐng)求參數(shù)集合轉(zhuǎn)換為json后坷虑,(不標(biāo)準(zhǔn))格式如下所示:

[{"name":"userName","value":"13911002200"},{"name":"password","value":"123456"},{"name":"days","value":"-1"},{"name":"deviceId","value":"02:00:00:00:00:00"},{"name":"appId","value":"11"},{"name":"mac","value":"02:00:00:00:00:00"},{"name":"timestamp","value":"2016-03-26 10:24:35"},{"name":"sign","value":"b2873caa5735d16535ff827ee2701cd1"}]

好吧,這樣的格式完全不是標(biāo)準(zhǔn)的json格式埂奈,服務(wù)器那邊需要的(標(biāo)準(zhǔn))json格式是:

{"deviceId":"02:00:00:00:00:00","password":"123456","days":"-1","sign":"b2873caa5735d16535ff827ee2701cd1","mac":"02:00:00:00:00:00","timestamp":"2016-03-26 10:24:35","appId":"11","userName":"13911002200"}

另外一個(gè)請(qǐng)求參數(shù)隊(duì)列轉(zhuǎn)后的json格式如下迄损,(不標(biāo)準(zhǔn)):

[{"name":"accountId","value":"2384403"},{"name":"password","value":"123456"},{"name":"ticket","value":"{"accountId":"2384403","appId":"11","loginName":"1302200","userName":"U12384403","email":"","mobilePhone":"1302200","timestamp":"2016-03-26","maxAge":-1,"ip":"","sign":"4109c59eff52a924e74be3623ecab27d","deviceId":"02:00:00:00:00:00"}"},{"name":"appId","value":"11"},{"name":"mac","value":"02:00:00:00:00:00"},{"name":"timestamp","value":"2016-03-26 10:26:01"},{"name":"sign","value":"22070f51197c15d256764a2de499ef85"}]

服務(wù)器那邊需要的另外一個(gè)請(qǐng)求參數(shù)隊(duì)列轉(zhuǎn)后的(標(biāo)準(zhǔn))json格式如下所示:

{"timestamp":"2016-03-26 10:26:01","password":"123456","appId":"11","ticket":"{"accountId":"2384403","appId":"11","loginName":"1302200","userName":"U12384403","email":"","mobilePhone":"1302200","timestamp":"2016-03-26","maxAge":-1,"ip":"","sign":"4109c59eff52a924e74be3623ecab27d","deviceId":"02:00:00:00:00:00"}","sign":"22070f51197c15d256764a2de499ef85","accountId":"2384403","mac":"02:00:00:00:00:00"}


好的,現(xiàn)在來(lái)說(shuō)一說(shuō)解決方法:

step1:將List<NameValuePair> params進(jìn)行遍歷然后丟在同一個(gè)Map集合中去

step2:使用JONUtil對(duì)Map集合進(jìn)行轉(zhuǎn)換成json格式字符串

代碼如下所示:

/*** 將請(qǐng)求參數(shù)轉(zhuǎn)換為json格式*/
Map map=new HashMap();
for (int i=0;i<requestParams.params.size();i++){
    NameValuePair nameValuePair=requestParams.params.get(i);
    map.put(nameValuePair.getName(),nameValuePair.getValue());
}
String request=JSONUtil.toJSON(requestParams.params);
String jsonRequest=JSONUtil.toJSON(map);
LogUtil.d(TAG, "發(fā)送給服務(wù)器的內(nèi)容為:加密前的data::" + request);
LogUtil.d(TAG, "發(fā)送給服務(wù)器的內(nèi)容為:加密前的 json data::" + jsonRequest);

打印出來(lái)的日志如下所示:

發(fā)送給服務(wù)器的內(nèi)容為:加密前的data::[{"name":"userName","value":"13011002200"},{"name":"password","value":"123456"},{"name":"days","value":"-1"},{"name":"deviceId","value":"02:00:00:00:00:00"},{"name":"appId","value":"11"},{"name":"mac","value":"02:00:00:00:00:00"},{"name":"timestamp","value":"2016-03-26 10:24:35"},{"name":"sign","value":"b2873caa5735d16535ff827ee2701cd1"}]
發(fā)送給服務(wù)器的內(nèi)容為:加密前的 json data::{"deviceId":"02:00:00:00:00:00","password":"123456","days":"-1","sign":"b2873caa5735d16535ff827ee2701cd1","mac":"02:00:00:00:00:00","timestamp":"2016-03-26 10:24:35","appId":"11","userName":"13011002200"}
 發(fā)送給服務(wù)器的內(nèi)容為:加密前的data::[{"name":"accountId","value":"2384403"},{"name":"password","value":"123456"},{"name":"ticket","value":"{\"accountId\":\"2384403\",\"appId\":\"11\",\"loginName\":\"130***2200\",\"userName\":\"U12384403\",\"email\":\"\",\"mobilePhone\":\"130***2200\",\"timestamp\":\"2016-03-26\",\"maxAge\":-1,\"ip\":\"\",\"sign\":\"4109c59eff52a924e74be3623ecab27d\",\"deviceId\":\"02:00:00:00:00:00\"}"},{"name":"appId","value":"11"},{"name":"mac","value":"02:00:00:00:00:00"},{"name":"timestamp","value":"2016-03-26 10:26:01"},{"name":"sign","value":"22070f51197c15d256764a2de499ef85"}]
發(fā)送給服務(wù)器的內(nèi)容為:加密前的 json data::{"timestamp":"2016-03-26 10:26:01","password":"123456","appId":"11","ticket":"{\"accountId\":\"2384403\",\"appId\":\"11\",\"loginName\":\"130***2200\",\"userName\":\"U12384403\",\"email\":\"\",\"mobilePhone\":\"130***2200\",\"timestamp\":\"2016-03-26\",\"maxAge\":-1,\"ip\":\"\",\"sign\":\"4109c59eff52a924e74be3623ecab27d\",\"deviceId\":\"02:00:00:00:00:00\"}","sign":"22070f51197c15d256764a2de499ef85","accountId":"2384403","mac":"02:00:00:00:00:00"}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末账磺,一起剝皮案震驚了整個(gè)濱河市芹敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垮抗,老刑警劉巖氏捞,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冒版,居然都是意外死亡液茎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門辞嗡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捆等,“玉大人,你說(shuō)我怎么就攤上這事续室《翱荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵挺狰,是天一觀的道長(zhǎng)明郭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)丰泊,這世上最難降的妖魔是什么薯定? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮瞳购,結(jié)果婚禮上话侄,老公的妹妹穿的比我還像新娘。我一直安慰自己苛败,他們只是感情好满葛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布径簿。 她就那樣靜靜地躺著,像睡著了一般嘀韧。 火紅的嫁衣襯著肌膚如雪篇亭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天锄贷,我揣著相機(jī)與錄音译蒂,去河邊找鬼。 笑死谊却,一個(gè)胖子當(dāng)著我的面吹牛柔昼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炎辨,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捕透,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了碴萧?” 一聲冷哼從身側(cè)響起乙嘀,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎破喻,沒(méi)想到半個(gè)月后虎谢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曹质,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年婴噩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羽德。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡几莽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玩般,到底是詐尸還是另有隱情银觅,我是刑警寧澤礼饱,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布坏为,位于F島的核電站,受9級(jí)特大地震影響镊绪,放射性物質(zhì)發(fā)生泄漏匀伏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一蝴韭、第九天 我趴在偏房一處隱蔽的房頂上張望够颠。 院中可真熱鬧,春花似錦榄鉴、人聲如沸履磨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剃诅。三九已至巷送,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矛辕,已是汗流浹背笑跛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聊品,地道東北人飞蹂。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像翻屈,于是被迫代替她去往敵國(guó)和親陈哑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理伸眶,服務(wù)發(fā)現(xiàn)芥颈,斷路器,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • # 一度蜜v3.0協(xié)議 --- # 交互協(xié)議 [TOC] ## 協(xié)議說(shuō)明 ### 請(qǐng)求參數(shù) 下表列出了v3.0版協(xié)...
    c5e350bc5b40閱讀 644評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法赚抡,類相關(guān)的語(yǔ)法爬坑,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法涂臣,異常的語(yǔ)法盾计,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,622評(píng)論 18 399
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx閱讀 8,327評(píng)論 0 16
  • “選擇放手”,我已經(jīng)忘記當(dāng)時(shí)的心情了赁遗,只知道我還一直想著他署辉!周末在家,傻傻的等著他來(lái)找我岩四,在窗戶外看了一遍又...
    歡菲閱讀 208評(píng)論 0 0