版权声明:本文为博主原创文章,未经博主允许不得转载。
这里写个测试用例模拟外部调用,通过httppost 传递一个json封装的表单数据。
包:import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
相关总结:http://xp9802.iteye.com/blog/2123450
每个json包都不一样,这里主要是fastjson包的用法。
接收到的字符串:result.toString():{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}
JSONObject jsonObject = JSONObject.parseObject(result.toString()); 用pareseObject 直接转换为object类
这种方式对对方只传递一个类封装的json字符串,最实用。
测试2:用StringEntity 封装的json字符串传递一个list。
在输入端构造一个List,用list 添加几个对象,再转换为json 传过去,接收到的数据与测试1 的差距就是多了一个"[ ]"
goodsInfoList.add(goodsInfo1);
goodsInfoList.add(goodsInfo2);
goodsInfoList.add(goodsInfo3);
String jsonstr = JSON.toJSONString(list);
接收到的字符串:result.toString():[{"brand":1,"goodsName":"1231213","goods_id":111,"type":1},{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}]
List
测试3:用StringEntity 封装的json字符串传递一个由list封装的类中。
public class GoodsInfoRet {
private List
private int total_record;
public List
return goodList;
}
public void setGoodList(List
this.goodList = goodList;
}
public int getTotal_record() {
return total_record;
}
public void setTotal_record(int total_record) {
this.total_record = total_record;
}
}
GoodsInfoRet good_dto = new GoodsInfoRet();
good_dto.setGoodList(goodsInfoList);
good_dto.setTotal_record(goodsInfoList.size());
JSONObject jsonObject = JSONObject.parseObject(result.toString());
接收到的字符串:result.toString(): {"goodList":[{"brand":1,"goodsName":"1231213","goods_id":111,"type":1},{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}],"total_record":2}
jsonObject: {"goodList":[{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}, {"brand":1,"goodsName":"1231213","goods_id":111,"type":1}],"total_record":2}
在转换为list对象: Object jsonArray = jsonObject.get("goodList");
List
得到一个list的类,然后再遍历,在循环。
综上,用StringEntity se = new StringEntity(jsonstr); 是很有用的,能输出正确的代码格式,最后方便解析。
测试4:用List
String jsonstr = JSON.toJSONString(goodsInfo);
List
params.add(new BasicNameValuePair("param",jsonstr));
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response=new DefaultHttpClient().execute(httpPost);
接收到的字符串:result.toString() : param=%7B%22brand%22%3A1%2C%22goodsName%22%3A%221231213%22%2C%22goods_id%22%3A111%2C%22type%22%3A1%7D
这是url 编码,所以需要转码
URLDecoder.decode(result.toString(), "utf-8")
param={"brand":1,"goodsName":"1231213","goods_id":111,"type":1}
这时需要对字符串进行一个split的处理。
String s = URLDecoder.decode(result.toString(), "utf-8");
String[] s1 = s.split("=");
JSONObject object = JSON.parseObject(s1[1]);
这样就能得到一个已object 的对象
自行封装
goodsInfo.setGoodsName(jsonObject.getString("goodsName"));测试5:用List
String jsonstr = JSON.toJSONString(goodsInfoList);
转换的是一个list对象转换为json字符串,再放在 params 中,
那么接收到的字符串是:
URLDecoder.decode(result.toString(), "utf-8")
param=[{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}]
这时需要对字符串进行一个split的处理。
String s = URLDecoder.decode(result.toString(), "utf-8");
String[] s1 = s.split("=");
List
这样就能得到一个已list的对象。
综上:传list封装的json要比类封装的json方便,用StringEntity要比List
其他:httpge方式传递数据
如果用url拼接字符串传递数据,那会非常方便,前端不用做任何处理,使用与PHP与Java之间的交互。php只用拼接url就行了。
如:前端url
http://10.118.44.37:8070/teshi-web/supplier/synYxSupplier?supplierName=pl_test3%28%%29&supplierNo=60074&stName=%E4%81&stId=6
后端java 接收
@RequestMapping(value="/totallist")
public String totallist(OrderQuery orderQuery, HttpServletResponse response) {
if(StringUtils.isEmpty(orderQuery.getOrder())) {
orderQuery.setOrder("desc");
}
return query(orderQuery, response);
// return "order/totallist";
}
只需要和接口人确认相关字段的键值,然后用spring自动封装,不用request 拿值,这样取得传过来的一个类是非常方便的是非常方便的。
但是不适用与传list对象。