我的Android进阶之旅------>android如何将List请求参数列表转换为json格式
本文同步发表在简书,链接:http://www.jianshu.com/p/395a4c8b05b9
前言
由于接收原来的老项目并进行维护,之前的http请求是使用Apache Jakarta Common下的子项目HttpClient,因此使用了 List<NameValuePair> 方式来创建参数队列,然后通过一个字符串处理的工具类,生成的post请求体格式大致如:
a=b&c=d&e=f
但是由于服务器api变更,需要将请求体的格式变成json格式,因此上面的请求参数要变成:
{"a":"b","c":"d","e":"f"}
但是如果将List<NameValuePair>直接通过Jackson或者Gson等第三方工具的转json的开源类库去转换为json格式的话,转出来的json格式如:
[{"name":"a","value":"b"},{"name":"c","value":"d"},{"name":"e","value":"f"}]
如下面代码所示:
public class RequestParams {
/**请求地址*/
public String url;
/**请求参数集合*/
public List<NameValuePair> params;
} /**
* 帐号登录
*
* @param userName 账号名
* @param password 密码
* @param days 记住密码天数:days>0定期超时;days=-2永不失效;
* days=-1永久记住密码(30天没有操作则失效)
* @param deviceId 账户在设备上的唯一标识符(机器码或mac地址)
* @param appId 应用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;
}
在请求的时候,将List<NameValuePair> params取出来,然后使用JSONUtil工具类转换成json格式,代码如下所示:
String request=JSONUtil.toJSON(requestParams.params);
其中换成json格式的工具类JSONUtil,该工具类使用了jackjson的第三方json解析库,代码如下所示:
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转换工具类
*
* @author OuyangPeng
* @version [1.0.0.0, 2016-3-23]
*/
public class JSONUtil { private static String TAG = SSOJSONUtil.class.getName(); private static ObjectMapper mapper = new ObjectMapper(); static {
//对于为null的字段不进行序列化
mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
//对于未知属性不进行反序列化
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//无论对象中的值只有不为null的才进行序列化
mapper.setSerializationInclusion(Include.NON_NULL);
} /**
* 把对象转化成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字符串转成对象
*
* @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字符串转化成集合
*
* @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请求参数集合转换为json后,(不标准)格式如下所示:
[{"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"}]
好吧,这样的格式完全不是标准的json格式,服务器那边需要的(标准)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"}
另外一个请求参数队列转后的json格式如下,(不标准):
[{"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"}]
服务器那边需要的另外一个请求参数队列转后的(标准)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"}
好的,现在来说一说解决方法:
step1:将List<NameValuePair> params进行遍历然后丢在同一个Map集合中去
step2:使用JONUtil对Map集合进行转换成json格式字符串
代码如下所示:
/*** 将请求参数转换为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=SSOJSONUtil.toJSON(requestParams.params);
String jsonRequest=SSOJSONUtil.toJSON(map);
LogUtil.d(TAG, "发送给服务器的内容为:加密前的data::" + request);
LogUtil.d(TAG, "发送给服务器的内容为:加密前的 json data::" + jsonRequest);
打印出来的日志如下所示:
发送给服务器的内容为:加密前的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"}]
发送给服务器的内容为:加密前的 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"}
发送给服务器的内容为:加密前的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"}]
发送给服务器的内容为:加密前的 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"}
====================================================================
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng
====================================================================
我的Android进阶之旅------>android如何将List请求参数列表转换为json格式的更多相关文章
- 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法
我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...
- 我的Android进阶之旅------>Android中查看应用签名信息
一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...
- 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计
要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...
- 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现
我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)
在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)
正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)
对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游 ...
随机推荐
- 2.Stacks(堆栈)
一.概述 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构. 二.常用API empty() 堆栈为空则返回真 pop() ...
- Java序列化与反序列化学习(三):序列化机制与原理
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的 过程.Java序列化API提供 ...
- ToStringBuilder学习(三):readResolve()方法与序列化
在ToStringBuilder学习(一)中提到一个问题,即 readResolve方法是干啥的? 当时也没多想, 只是列在那里, 今天忙里偷闲地把搜点材料整理下这个问题. 原来这个方法跟对象的序列化 ...
- flex and bison学习笔记01
工作需要,学习一下Flex and bison,以前在编译原理的课上听老师说过他们的前辈,lex and yacc.Flex and bison就是lex and yacc的升级版. 参考书:flex ...
- Jquery js框架使用
jquery 众所周知 ,强大的 js框架 自己使用的一些笔记 //1.json格式定义方法 var product_obj={ check_init:function(){ ...
- IPC之SystemV
svipc - System V interprocess communication mechanisms linux实现的System V interprocess communication ( ...
- yii2 RESTful API 405 Method Not Allowed
关于 Yii2 中 RESTful API 的开发,可以参考另一篇随笔 http://www.cnblogs.com/ganiks/p/yii2-restful-api-dev.html 测试的过程中 ...
- C++ STL标准模板库(vector)
//vector的使用 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> using na ...
- 安装tomcat出现failed to install tomcat6 service错误及解决方法(转载)
安装安装版tomcat会出现failed to install tomcat6 service ,check your setting and permissio的概率是非常低的,但是最近楼主就老出现 ...
- spotlight on windows 监控
1. spotlight on windows 安装 下载 https://pan.baidu.com/s/1qYi3lec Spotlight大家可以从其官方网站(http://www.quest. ...