今天在寫代碼時(shí)碰到了很讓人頭疼的事情,
在php的代碼中有如下
// 封裝數(shù)據(jù)
$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數(shù)據(jù)很容易的封裝了自己想要的屬性,而我當(dāng)初最初的想法是
創(chuàng)建個(gè)新的對象來返回
比如原先的對象是
public class Stock implements Serializable {
public static final String INTRODUCE="股票";
private String name;//股票名
private BigDecimal lastPx;//股票當(dāng)前價(jià)
private BigDecimal preClose;//收盤價(jià)
private BigDecimal openPx;//開盤價(jià)
private BigDecimal highPx;//最高價(jià)
private BigDecimal lowPx;//最低價(jià)
private int businessAmount; //成交數(shù)目 由于股票交易以一百股為基本單位,所以在使用時(shí),通常把該值除以一百;
private BigDecimal businessMoney;//成交金額 單位為“元”,為了一目了然,通常以“萬元”為成交金額的單位,所以通常把該值除以一萬;
private BigDecimal pxChange;//漲跌額
private BigDecimal pxChangeRate;//漲跌幅
那當(dāng)需求是返回部分?jǐn)?shù)據(jù)時(shí)我只能創(chuàng)建新的對象來把數(shù)據(jù)封裝起來
public class StockZS implements Serializable {
private String name;//股票名
private BigDecimal pxChange;//漲跌額
private BigDecimal lastPx;//股票當(dāng)前價(jià)
private BigDecimal pxChangeRate;//漲跌幅
private int businessAmount; //成交數(shù)目 由于股票交易以一百股為基本單位,所以在使用時(shí),通常把該值除以一百;
private String turnover_ratio;
那可想而知如果需求一改那對象就沒完沒了了
因?yàn)橹皇呛唵蔚陌褦?shù)據(jù)查詢到的返回,所以干脆試著用下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測試結(jié)果是

image.png
可想而知,我們的名字跑到了最下面,但是我們的名字卻并不是最后添加的甚至優(yōu)于message問題就出現(xiàn)在了hashmap這個(gè)數(shù)據(jù)結(jié)構(gòu)
hashmap是一個(gè)散列圖沒有順序! 這個(gè)順序指的是插入順序和出來順序一樣而不是進(jìn)行排序。因此我們必須改用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;
}

image.png
這樣就可以按照你喜歡的方式和你想要的順序返回json字符串了~~