json返回有序 2019 4.25

今天在写代码时碰到了很让人头疼的事情,
在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 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测试结果是

image.png

可想而知,我们的名字跑到了最下面,但是我们的名字却并不是最后添加的甚至优于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 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字符串了~~

你可能感兴趣的:(json返回有序 2019 4.25)