JSON数据以不按接收顺序排列

问题描述

some: {
  "success": true,"data": 
[
  {
    "15-10-2020": [
      {
        "id": 100,"details": {
          "_id": 1,"_title": "My Title"
        },"created_at": "2020-10-15"
      },{
        "snf_id": 101,{
         "snf_id": 102,"created_at": "2020-10-15"
      }
    ],"30-09-2020": [
           {
         "snf_id": 301,"details": {
          "_id": 8,"created_at": "2020-09-30"
      }
  ]
  }
],"message": "Successfully Retrieved"
}

struct Response : Codable {
    var success : Bool?
    **var data : [[String:[Data]]]?**
    var message : String?
}
struct Data: Codable {
    var snf_id: Int?
    var details: Details?
    var created_at: String?
}

// MARK: - Details
struct Details: Codable {
    var _id: Int?
    var _title: String?
}

当我打印并使用来检查json数据时

let dataValue = String(data:data,encoding: .utf8)
print(dataValue)
// This is fine

在将数据解码到我的结构后,

let Response = try JSONDecoder().decode(Response.self,from: data)
print(Response)

数据顺序有误,这里做错了什么,如何纠正?

解决方法

可能是按顺序存储它们的唯一选择:

const toBeSorted = {some: {success: true,data:[{"15-10-2020": [{"id": 100,"details": {"_id": 1,"_title": "My Title"},"created_at": "2020-10-15"},{"snf_id": 101,{"snf_id": 102,"created_at": "2020-10-15"}],"30-09-2020": [{"snf_id": 301,"details": {"_id": 8,"created_at": "2020-09-30"}]
          }],"message": "Successfully Retrieved"}};
const arr = [];
const obj = toBeSorted.some.data[0];
for (const i in obj) { // split your big [{date:{},date:{},...}] to multiple objects [{date:{}},{date:{}},...]
    const subObj = {};
    subObj[i] = obj[i];
    arr.push(subObj);
}
arr.sort(byDateKey);
toBeSorted.some.data = arr;

document.body.innerHTML = '<PRE>' + JSON.stringify(toBeSorted,null,2)
    .replace(/([{[\]}])[\s\n]+([{[\]}])/g,'$1$2')
    .replace(/(\},)[\s\n]+(\{)/g,'$1$2') + '</PRE>'

function byDateKey (a,b) {
    a = Object.keys(a)[0].split('-');
    b = Object.keys(b)[0].split('-');
    for (let i = a.length; i--;) {
        if (a[i] !== b[i]) return parseInt(a[i]) - parseInt(b[i]);
    }
    return 0;
}

v2数组

const toBeSorted = {some: {success: true,...]
    arr.push([i,obj[i]]);
}
arr.sort(byDateKey);
toBeSorted.some.data = arr;

document.body.innerHTML = '<PRE>' + JSON.stringify(toBeSorted,b) {
    a = a[0].split('-');
    b = b[0].split('-');
    for (let i = a.length; i--;) {
        if (a[i] !== b[i]) return parseInt(a[i]) - parseInt(b[i]);
    }
    return 0;
}

或v3键似乎按插入顺序@end;-)

const toBeSorted = {some: {success: true,"message": "Successfully Retrieved"}};
const obj = toBeSorted.some.data[0];
var k = Object.keys(obj).sort(byDate);
var obj2 = {};
for (const i of k) { // split your big [{date:{},...]
    obj2[i] = obj[i];
}
toBeSorted.some.data[0] = obj2;

function byDate (a,b) {
    a = a.split('-');
    b = b.split('-');
    for (let i = a.length; i--;) {
        if (a[i] !== b[i]) return parseInt(a[i]) - parseInt(b[i]);
    }
    return 0;
}

document.body.innerHTML = '<PRE>' + JSON.stringify(toBeSorted,'$1$2') + '</PRE>'