【发布时间】:2019-10-04 15:13:33
【问题描述】:
我正在访问一个 web api,作为响应它会发送不同的有效载荷,包裹在同一个信封中,如下所示:
获取食谱列表:
{
"status": "SUCCESS",
"messages": [],
"input": null,
"output": [
{
"id": 1,
"title": "Egg with bacon"
},
{
"id": 2,
"title": "Ice cream"
}
]
}
获取一个配方:
{
"status": "SUCCESS",
"messages": [],
"input": {"id": 1},
"output": {
"id": 1,
"title": "Egg with bacon"
}
}
错误响应:
{
"status": "ERROR",
"messages": ["Recipe not found"],
"input": {"id": 4},
"output": null
}
类别列表:
{
"status": "SUCCESS",
"messages": [],
"input": null,
"output": [
{
"id": 1,
"title": "Deserts"
},
{
"id": 2,
"title": "Main Courses"
}
]
}
因此,信封键始终存在。输入是键值对象或空值,消息总是字符串数组或空数组,状态是字符串。但输出可能不同。它可以是一种 Recipe 结构、Recipe 结构数组或 Category 结构。
我的问题是:我如何解码这个 json 而无需每次都为信封编写相同的解码逻辑?我想只为信封编写一次解码器,并为输出注入不同的解码器。
【问题讨论】:
-
@vadian 您的解决方案暗示
output类型可以通过status属性确定,此处似乎并非如此。 -
@rraphael 不是通过 status 属性,而是通过 input 属性,如果为 null,则输出为数组,否则为单个元素
标签: json swift decoder decodable