json.stringify排序问题

720 阅读1分钟

json.stringify发生的顺序问题

与后端对接中,发送的请求要进行验签,验签要求发送的数据必须是按照A-Z进行排序。使用sort()进行排序后在用json.stringify进行序列化。

问题:多层嵌套的对象进行排序后,使用json.stringify进行序列化时出错了,他将内部排好的序变回了一开始的顺序。

//初始数据
 var item = {
      desc: "测试1",
      code: "123",
      stage: [
        { 
          stagedesc: "阶段1",
          stagecode: "123456",
          stageqty: 0,
          stagelongtime: 60,
          stageseq: 1,
          stageproject: [
            {
              projectcode: "456",
              projectdesc: "P1"
            }
          ]
        }
      ]
    };

使用sort进行排序后

image.png

使用json.stringify后

{"code":"123","desc":"测试1","stage":[{"stagedesc":"阶段1","stagecode":"123456","stageqty":0,"stagelongtime":60,"stageseq":1,"stageproject":[{"projectcode":"456","projectdesc":"P1"}]}]}

可看出内部顺序乱了,变成了一开始的顺序

思路

多层对象排序json转化,只有第一层的顺序是改变的,而这是把排序好的赋给空对象。根据这个结果猜测,得若每层都都为空数组,然后再把排序的值赋值进去,在转化,应该能行

代码


function keySort(obj) {
      //排序
      var newkey = Object.keys(obj).sort();
      var newObj = {};
      for (var i = 0; i < newkey.length; i++) {
        newObj[newkey[i]] = obj[newkey[i]];
      }
      return newObj
    }


    //第一层
    let newObj = {};
    newObj = keySort(item)

    newObj.stage = []
    item.stage.forEach(e => {
      //第二层排序
      e = keySort(e)
      let temp = []
    e.stageproject.forEach(row => {
        //第三层排序
        item = keySort(row)
        temp.push(row)
      })
      e.stageproject = temp
      newObj.stage.push(e)
    })

    //转化
    newObj = JSON.stringify(newObj)
    console.log(newObj);

大功告成!