如何在Java中基于嵌套JSON字段对JSON数组进行降序排序
按嵌套日期字段对JSON数组进行降序排序
问题描述
我在排序JSON数组时遇到了问题,需要按照嵌套键 resource -> dosageInstruction -> timing -> repeat -> boundsPeriod -> start 对数组进行降序排序。以下是我的输入JSON数组:
[ { "search": { "mode": "match" }, "resource": { "prescriber": {}, "identifier": [], "medicationReference": {}, "dosageInstruction": [ { "route": {}, "method": {}, "timing": { "repeat": { "period": 1, "periodUnits": "d", "boundsPeriod": { "start": "11/15/2016", "end": "11/23/2016" }, "frequency": 1 } }, "doseQuantity": { "unit": "mg", "code": "mg", "system": "dasdsadasd", "value": 10 }, "asNeededBoolean": false, "text": "Take 10 mg by mouth nightly." } ], "dispenseRequest": { "validityPeriod": { "start": "11/15/2016", "end": "11/23/2016" } }, "patient": { "reference": "asdasdsada", "display": "Jason Argonaut" }, "id": "T5YI1tCzs--JEvCICFbx8zgB", "dateWritten": "11/13/2016", "resourceType": "MedicationOrder", "status": "active" }, "fullUrl": "asdsadasa", "link": [ { "url": "dassad", "relation": "self" } ] }, { "search": { "mode": "match" }, "resource": { "prescriber": { "reference": "dsfsd", "display": "Physician Cdr Inpatient, MD" }, "identifier": [ { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.2.798268", "use": "usual", "value": "971103" }, { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.3.798268.801", "use": "usual", "value": "971103:2802249019" } ], "medicationReference": { "reference": "dfsdf", "display": "amphetamine-dextroamphetamine XR (ADDERALL XR) 15 MG 24 hr capsule" }, "dosageInstruction": [ { "route": { "coding": [ { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.698288.330", "code": "15", "display": "Oral" } ], "text": "Oral" }, "method": { "coding": [ { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.798268.8600", "code": "11", "display": "Take" } ], "text": "Take" }, "timing": { "repeat": { "period": 1, "periodUnits": "d", "boundsPeriod": { "start": "11/07/2015", "end": "12/07/2015" }, "frequency": 1 } }, "doseQuantity": { "unit": "capsule", "value": 1 }, "asNeededBoolean": false, "text": "Take 1 capsule (15 mg total) by mouth every morning. Max Daily Amount: 15 mg" } ], "dispenseRequest": { "validityPeriod": { "start": "11/07/2015", "end": "12/07/2015" }, "quantity": { "unit": "capsule", "value": 30 }, "numberOfRepeatsAllowed": 0, "expectedSupplyDuration": { "unit": "days", "code": "d", "system": "urn:oid:2.16.840.1.113883.6.8", "value": 30 } }, "patient": { "reference": "https://open-ic.epic.com/FHIR/api/FHIR/DSTU2/Patient/Tbt3KuCY0B5PSrJvCu2j-PlK.aiHsu2xUjUM8bWpetXoB", "display": "Jason Argonaut" }, "id": "TsmsDHh.ouMCg8QqhDaAMSAB", "dateWritten": "11/07/2015", "resourceType": "MedicationOrder", "status": "active" }, "fullUrl": "https://open-ic.epic.com/FHIR/api/FHIR/DSTU2/MedicationOrder/TsmsDHh.ouMCg8QqhDaAMSAB", "link": [ { "url": "https://open-ic.epic.com/FHIR/api/FHIR/DSTU2/MedicationOrder/TsmsDHh.ouMCg8QqhDaAMSAB", "relation": "self" } ] } ]
解决方案
要实现这个需求,我们可以使用JavaScript的 Array.sort() 方法,核心是将嵌套的日期字符串转换为可比较的 Date 对象,然后按降序排列。这里需要注意日期格式是 MM/DD/YYYY,直接传入 Date 构造函数即可正确解析。
另外,为了避免因某些元素缺失嵌套字段导致报错,我们可以添加简单的容错处理:
// 假设你的JSON数组已经解析为JavaScript对象数组,比如叫medicationOrders const sortedMedicationOrders = [...medicationOrders].sort((a, b) => { // 获取元素的start日期,处理可能的字段缺失 const getStartDate = (item) => { try { const startStr = item.resource.dosageInstruction[0].timing.repeat.boundsPeriod.start; return new Date(startStr); } catch (e) { // 如果字段缺失,返回一个极早的日期,确保这类元素排在末尾 return new Date(0); } }; const dateA = getStartDate(a); const dateB = getStartDate(b); // 降序排序:日期大的排在前面 return dateB - dateA; }); // 输出排序后的结果 console.log(JSON.stringify(sortedMedicationOrders, null, 2));
代码说明
- 解构数组:使用
[...medicationOrders]创建原数组的副本,避免修改原数组。 - 日期提取函数:
getStartDate函数安全地提取嵌套的日期字段,通过try/catch处理字段缺失的情况,返回默认的极早日期。 - 排序逻辑:
dateB - dateA实现降序排序,因为Date对象相减会返回时间戳的差值,较大的日期时间戳更大,所以差值为正会让b排在a前面。
运行这段代码后,你的数组会按照 boundsPeriod.start 字段从最新到最旧的顺序排列。
内容的提问来源于stack exchange,提问作者shubham katariya
相关产品推荐
相关产品推荐

