【问题标题】:Having trouble decoding JSON file in swift快速解码 JSON 文件时遇到问题
【发布时间】: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


【解决方案1】:

您可以再次查看 CalorieNinja API。
我认为卡路里字段应该是 Double?由于他们的文件。

【讨论】:

  • 是的,谢谢你,很抱歉你拯救了我的一天,我准备扔掉我的电脑
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多