【问题标题】:Issue displaying array data inside UIAlert View在 UIAlert 视图中显示数组数据的问题
【发布时间】:2021-06-08 00:03:31
【问题描述】:

基本上我想解析从 url 接收到的 JSON 并在警报弹出窗口中显示数据。

我可以使用下面的简单数组来做到这一点,但不知道如何使用来自 URL 的 JSON 数组来做到这一点。

目前工作:

let jsonObj:[String: Any] = ["error": [
                "email": ["The email has already been taken."],
                "phone": ["The phone has already been taken."]]
                ]
if let errorMsgs = jsonObj["error"] as? [String: [String]] {
    let errMsg = errorMsgs.values.map { $0.reduce("", +) }.joined(separator: "\n")
    print(errMsg)
    self.presentAlert(withTitle: "Try again", message: errMsg)
    
}

JSON 数组:

var structure = [Struct]()
private func fetchJSON() {
        guard let url = URL(string: "url.com")
            else { return }
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = "code=\(codeValue)".data(using: .utf8)
        URLSession.shared.dataTask(with: request) { data, _, error in
            guard let data = data else { return }
            do {
                self.structure = try JSONDecoder().decode([Struct].self,from:data)
            }
            catch {
                print(error)
            }
            }.resume()
    }

    struct Struct: Decodable {
        let id: Int
        let reasons: String
    }

示例 JSON 数组:

[
  {
    "id": 1,
    "reasons": "Test"
  },
  {
    "id": 3,
    "reasons": "Test"
  }
]

如何从数组中获取原因字符串以填充到类似于上面的警报中。

更新:

为了打印警报中的记录,我做了以下操作,但它只在警报中打印一条记录:

for item in self.structure {
print(item.reasons)
let errMsg = [item.reasons].compactMap { $0 }.joined(separator: "\n")
self.presentAlert(withTitle: "Try again", message: errMsg)
}

【问题讨论】:

  • 您如何在UITableView 中显示数据?并在从 backed 获取数据后打印 self.structure 并检查是否有任何信息。
  • 道歉是错误的 - 我没有 tableview,我只是使用该函数来解析 JSON 数组
  • 不用担心。打印self.structure 并检查您是否先从服务器获取任何内容。
  • 我需要显示类似于工作示例的数组中的原因值
  • 是的,我得到了结果

标签: arrays json swift


【解决方案1】:

在这里,我根据您的代码创建了示例。

首先将您的Codable 替换为:

// MARK: - Reason
struct Reason: Codable {
    let id: Int
    let reasons: String
}

typealias Reasons = [Reason]

这是您在JSON 字符串格式中的服务器响应:

let json = """
    
    [
      {
        "id": 1,
        "reasons": "Test"
      },
      {
        "id": 3,
        "reasons": "Test"
      }
    ]
    
    """

然后我将其转换为 Data 仅用于测试目的:

let data = json.data(using: .utf8)!

你可以用它来解析它

do {
    self.reasonsData = try JSONDecoder().decode(Reasons.self, from:data)
    for item in self.reasonsData {
        print(item.reasons) //This will print reasons.
    }
}
catch {
    print(error)
}

更新:

如果你想要一个字符串中的所有原因,那么替换

for item in self.reasonsData {
    print(item.reasons)
}

let errMsg = self.reasonsData.compactMap { $0.reasons }.joined(separator: "\n")

【讨论】:

  • 您介意在我的示例中展示您的代码将如何使用吗?原因数据来自哪里
  • reasonsData 来自我手动创建的json 字符串。在您的情况下,您将从服务器获取它。
  • 好的,我遇到的问题较小,请查看我的更新
  • @MarkLyson 请检查我的更新答案。
  • @MarkLyson 如果有帮助,请接受答案。谢谢
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多