【发布时间】:2023-03-24 14:59:01
【问题描述】:
我正在尝试从 CalorieNinja API 解码 JSON 格式,但似乎他们 json 中的等号使我的代码失效。这是我解码 JSON 文件的代码:
let dataTask = session.dataTask(with: request) { (data, response, error) in
//check errors
if error == nil && data != nil {
let decoder = JSONDecoder()
do{
let result = try decoder.decode(Result.self, from: data!)
print(result)
}catch{
print("there was an error")
print(error)
}
}
}
这是我的结构:
struct FoodItem: Codable {
var name: String?
var calories: String?
}
struct Result: Codable {
var items: [FoodItem]?
}
这是从 CalorieNinjas 返回的 JSON 格式(这只是一个示例,这不是我的代码的输出):
{
items = (
{
calories = "18.2";
"carbohydrates_total_g" = "3.9";
"cholesterol_mg" = 0;
"fat_saturated_g" = 0;
"fat_total_g" = "0.2";
"fiber_g" = "1.2";
name = tomato;
"potassium_mg" = 23;
"protein_g" = "0.9";
"serving_size_g" = 100;
"sodium_mg" = 4;
"sugar_g" = "2.6";
}
);
}
如果有帮助的话,最后这里是错误:
typeMismatch(Swift.String, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "items", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "calories", intValue: nil)], debugDescription: "Expected to decode String but found a number instead.", underlyingError: nil))
【问题讨论】:
-
您在此处发布的 JSON 不是有效的 JSON。它实际上是您收到的内容,还是您打印了一个从 JSON 解析的 NSDictionary?如果这是您收到的实际字节,则它不是 JSON,并且 Codable 将不起作用。如果不是,您需要显示您真正收到的 JSON。根据您的错误,正在解析的实际字节有一个数字为
calories,但您的输出有一个字符串,所以我认为这不是您传递给解码器的内容。 -
@RobNapier 是的,我认为你是对的。我觉得超级愚蠢,我完全不知道如何解决这个问题,我为自己的愚蠢感到抱歉,这是我第一次使用 API。我会像一个好孩子一样回到文档中。
-
诸如 Paw (paw.cloud) 或 Postman (postman.com) 之类的工具可以通过向您展示 JSON 的真实样子来为您提供很多帮助。有助于避免大量猜测。 Quicktype (app.quicktype.io/?l=swift) 通常也可以为您编写所有代码。
-
要解决您的问题,您可以尝试更改 >> 到 >> 换句话说,将卡路里字段的类型更改为 Double?。希望对你有帮助。
标签: json swift xcode jsondecoder