gpt4 book ai didi

json - 解码具有相同信封但不同内容的 JSON 响应

转载 作者:行者123 更新时间:2023-11-28 05:37:24 25 4
gpt4 key购买 nike

我正在访问一个 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"
}
]
}

因此,信封 key 始终存在。输入是一个键值对象或null,消息总是一个字符串数组或空数组,状态是字符串。但输出可能不同。它可以是一种食谱结构、食谱结构数组或类别结构。

我的问题是:如何在不每次都为信封编写相同的解码逻辑的情况下解码这个 json?我只想为信封编写一次解码器,然后为输出注入(inject)不同的解码器。

最佳答案

您可以创建一个可解码的结构,您将使用它来包装您的输入和输出。

这看起来像:

struct ResponseContainer<Input: Decodable, Output: Decodable>: Decodable {
var status: String
var messages: [String]
var input: Input?
var output: Output
}

使用这个,如果你想解码单个 Recipe,你只需将你的 Recipe 结构包装到响应容器中:

// used to decode the `input`
struct InputId: Decodable {
var id: Int
}

// content of the `output`
struct Recipe: Decodable {
var id: Int
var title: String
}

try? JSONDecoder().decode(ResponseContainer<InputId, Recipe>.self, from: singleRecipeJson)

如果你想解码食谱列表,只需对另一个结构或数组进行相同的处理即可:

// As the input is expected to be null, you can use a dummy struct in the wrapper.
struct Empty: Decodable {}

try! JSONDecoder().decode(ResponseContainer<Empty, [Recipe]>.self, from: multipleRecipeJson)

注意:虚拟结构 Empty 可能没有用,因为它增加了很多复杂性,并且用于解析 input 属性负载的一部分,它看起来像是你发送给 API 的东西(所以基本上你已经知道了,可以忽略它)。在那种情况下,包装器看起来像这样:

struct ResponseContainer<Output: Decodable>: Decodable {
var status: String
var messages: [String]
var output: Output
}

关于json - 解码具有相同信封但不同内容的 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58239099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com