【问题标题】:sending parsed JSON data to views将解析的 JSON 数据发送到视图
【发布时间】:2020-12-22 00:25:45
【问题描述】:

我卡住了,因为我无法将 JSON 数据从 URLSession func 发送到视图。我阅读了之前 90% 的推荐并观看了很多视频,但我没有迁移到我的项目中。这是我需要帮助的代码块;

这是我的 json 结构

struct APIResponse: Decodable{
    let stocks: [Stocks]
}

struct Stocks: Decodable{
    
    let id: Int
    let difference: Float
    let bid:Float
    let isDown: Bool
    let isUp: Bool
    let offer: Float
    let price: Float
    let symbol: String
    let volume: Double

    
}

这是我的JsonDecode代码块;

if let data2 = data2 {
 do {
 // let json = try JSONSerialization.jsonObject(with: data2, options: [])
                                    
let apiResponse  = try JSONDecoder().decode(APIResponse.self, from: data2)
                                    
 print(apiResponse.stocks[2].volume)

   DispatchQueue.main.async {
       completed()
            }

        }catch{
            print(error)
              }    
         }
            }.resume()

当我观看有关它的视频时,它们是 [APIResponse].self,但是当我尝试这种方式时,我的代码失败了,以我的方式 json 解析正在工作(我可以像 'apiResponse.stocks[2].id' 一样调用)但我无法将此 apiResponse 数据发送到视图。

我的 JSON 文件示例

{
    status =     {
        error =         {
            code = 0;
            message = "";
        };
        isSuccess = 1;
    };
    stocks =     (
                {
            bid = "31.5";
            difference = "-0.2";
            id = 1190;
            isDown = 1;
            isUp = 0;
            offer = "31.6";
            price = "31.81";
            symbol = "P4jfFAYOTiLEih2Ic+NAkg==";
            volume = "801457.5";
        },
                {
            bid = "4.25";
            difference = "-0.04";
            id = 471;
            isDown = 1;
            isUp = 0;
            offer = "4.26";
            price = "4.31";
            symbol = "zomIgqEl79jIE+TJ7xV4yQ==";
            volume = "349264.21";
        },
                {
            bid = "2.86";
            difference = "-0.01";
            id = 472;
            isDown = 1;
            isUp = 0;
            offer = "2.87";
            price = "2.87";
            symbol = "2DlR317+autGo3fiKwNhFA==";
            volume = "19279.4";
        },
                {
            bid = 55;
            difference = 1;
            id = 473;
            isDown = 0;
            isUp = 1;
            offer = "55.25";
            price = "56.74";
            symbol = "fvo0GQ+pqUmHXwm062Gatw==";
            volume = "2647954.25";
        },       {
            bid = "1.22";
            difference = "-0.04";
            id = 465;
            isDown = 1;
            isUp = 0;
            offer = "1.23";
            price = "1.26";
            symbol = "wR/24WChHVRFWZSUW1UdwQ==";
            volume = "2206441.67";
        }
    );
}

【问题讨论】:

  • completed(),此完成处理程序应包含一个参数,以便您可以发送解码数据,completed(apiResponse.stocks) 或类似

标签: ios json swift parsing


【解决方案1】:

首先,如果您想将响应发送回发起 API 调用的位置,您需要编写完成处理程序并将响应模型与处理程序一起发送;你可以参考 Closures for Swift。

除此之外,我注意到您的可解码结构中几乎没有错误,例如,您期望“差异”为浮点类型,但您发布的示例 JSON 包含“差异”为字符串,它适用于所有浮点和双精度值.

如果我们将所有变量声明为可解码结构中的可选变量,这将是一个很好的做法,就好像任何时候任何参数都不会响应一样,解析它就不会有任何问题。

【讨论】:

  • 关于在可判定结构中将所有属性设置为可选的错误建议,这可能会掩盖代码中的任何问题,因此它们不会被发现(并修复)。如果 API 文档说一个值可以为 null,则将其设为可选,但绝不可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多