今天在写代码时碰到了很让人头疼的事情,
在php的代码中有如下
// 封装数据
$data = array_merge($request->only([
'stock_code',
'credit_money',
'auto_defer',
'auto_selling_ceiling_price',
'auto_selling_floor_price'
]), [
'user_id' => $authUser->id,
'begin_stock_price' => $handleResult['begin_stock_price'],
'creation_fee' => $handleResult['creation_fee'],
'holding_stock_count' => $handleResult['holding_stock_count']
]);
它把json数据很容易的封装了自己想要的属性,而我当初最初的想法是
创建个新的对象来返回
比如原先的对象是
public class Stock implements Serializable {
public static final String INTRODUCE="股票";
private String name;//股票名
private BigDecimal lastPx;//股票当前价
private BigDecimal preClose;//收盘价
private BigDecimal openPx;//开盘价
private BigDecimal highPx;//最高价
private BigDecimal lowPx;//最低价
private int businessAmount; //成交数目 由于股票交易以一百股为基本单位,所以在使用时,通常把该值除以一百;
private BigDecimal businessMoney;//成交金额 单位为“元”,为了一目了然,通常以“万元”为成交金额的单位,所以通常把该值除以一万;
private BigDecimal pxChange;//涨跌额
private BigDecimal pxChangeRate;//涨跌幅
那当需求是返回部分数据时我只能创建新的对象来把数据封装起来
public class StockZS implements Serializable {
private String name;//股票名
private BigDecimal pxChange;//涨跌额
private BigDecimal lastPx;//股票当前价
private BigDecimal pxChangeRate;//涨跌幅
private int businessAmount; //成交数目 由于股票交易以一百股为基本单位,所以在使用时,通常把该值除以一百;
private String turnover_ratio;
那可想而知如果需求一改那对象就没完没了了
因为只是简单的把数据查询到的返回,所以干脆试着用下fastjson封装下
public class TestController {
@GetMapping("/test")
public JSONObject getJson(){
Map<String,Object> map=new HashMap<>();
map.put("like","打篮球");
map.put("like2","唱跳");
JSONObject jsonObject=new JSONObject();
jsonObject.put("qq","152461");
jsonObject.put("username","huang");
jsonObject.put("song","code");
jsonObject.put("sex","boy");
map.put("height","175");
map.put("weight","59");
jsonObject.put("message",new JSONObject(map));
return jsonObject;
}
}
使用postman测试结果是
可想而知,我们的名字跑到了最下面,但是我们的名字却并不是最后添加的甚至优于message问题就出现在了hashmap这个数据结构
hashmap是一个散列图没有顺序! 这个顺序指的是插入顺序和出来顺序一样而不是进行排序。因此我们必须改用linkedHashmap
看下fastjson源码就知道了
public JSONObject(int initialCapacity, boolean ordered) {
if (ordered) {
this.map = new LinkedHashMap(initialCapacity);
} else {
this.map = new HashMap(initialCapacity);
}
}
于是我们改成下面这样
@GetMapping("/test")
public JSONObject getJson(){
Map<String,Object> map=new LinkedHashMap<>();
map.put("like","打篮球");
map.put("like2","唱跳");
//初始化长度 是否有序
JSONObject jsonObject=new JSONObject(16,true);
jsonObject.put("qq","152461");
jsonObject.put("username","cxk");
jsonObject.put("song","code");
jsonObject.put("sex","boy");
map.put("height","175");
map.put("weight","59");
jsonObject.put("message",new JSONObject(map));
return jsonObject;
}
这样就可以按照你喜欢的方式和你想要的顺序返回json字符串了~~