You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在json-server中获取嵌套元素数据?(待办应用场景)

解决json-server中嵌套子任务的获取与删除问题

首先要明确:json-server不支持直接通过嵌套路径(比如tasks/1/mainTasks/1/subtasks/1)访问深层数组元素,同时_embed只适用于关联独立集合的资源(而非嵌套在对象里的数组),这就是你当前方法失效的原因。

下面给两种可行的解决方案:

方案一:重构数据结构为独立集合(推荐)

把mainTasks和subtasks拆成独立的顶层集合,用外键关联到父资源,这样就能利用json-server的原生路由进行CRUD操作:

修改后的db.json结构:

{
  "lists": [
    {"id": 1, "name": "Listeczka"},
    {"id": 2, "name": "TeżListeczka"}
  ],
  "tasks": [
    {"id": 1, "list_id": 1},
    {"id": 2, "list_id": 2}
  ],
  "mainTasks": [
    {"id": 1, "task_id": 1, "content": "This is task", "state": "NOTDONE"},
    {"id": 2, "task_id": 1, "content": "This is task", "state": "NOTDONE"},
    {"id": 3, "task_id": 2, "content": "This is task", "state": "NOTDONE"}
  ],
  "subtasks": [
    {"id": 1, "mainTask_id": 1, "content": "This is subtask", "state": "DONE"},
    {"id": 2, "mainTask_id": 1, "content": "This is subtask", "state": "NOTDONE"},
    {"id": 3, "mainTask_id": 1, "content": "This is subtask", "state": "NOTDONE"},
    {"id": 4, "mainTask_id": 2, "content": "This is subtask", "state": "DONE"},
    {"id": 5, "mainTask_id": 2, "content": "This is subtask", "state": "NOTDONE"},
    {"id": 6, "mainTask_id": 3, "content": "This is subtask", "state": "DONE"}
  ]
}

这样操作就简单了:

  • 获取指定子任务:GET http://localhost:3000/subtasks/1
  • 删除子任务:DELETE http://localhost:3000/subtasks/1
  • 关联查询(比如获取某个task下的所有mainTasks):GET http://localhost:3000/tasks/1?_embed=mainTasks

方案二:保留嵌套结构,通过整体更新实现删除

如果不想改动数据结构,只能先获取完整的task资源,修改嵌套数组后再整体PUT回去:

  1. 获取完整task数据:
GET http://localhost:3000/tasks/1
  1. 前端处理子任务删除:
    找到对应mainTasks中id为1的项,过滤掉其subtasks里id为1的元素。比如用JS处理:
// 假设获取到的task数据存在task变量中
const updatedTask = {
  ...task,
  mainTasks: task.mainTasks.map(mainTask => {
    if (mainTask.id === 1) {
      return {
        ...mainTask,
        subtasks: mainTask.subtasks.filter(subtask => subtask.id !== 1)
      };
    }
    return mainTask;
  })
};
  1. PUT更新整个task:
PUT http://localhost:3000/tasks/1
# 请求体为处理后的updatedTask对象

两种方案对比

  • 方案一:符合REST设计规范,支持更灵活的查询和操作,适合长期维护的项目。
  • 方案二:无需修改数据结构,适合快速原型开发,但每次操作都要处理整个对象,数据量大时效率较低。

内容的提问来源于stack exchange,提问作者Kacper Klimas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:45:34