【问题标题】:Is it possible to send two JSON object from PHP to Swift?是否可以将两个 JSON 对象从 PHP 发送到 Swift?
【发布时间】:2017-12-22 15:41:31
【问题描述】:

我想从 PHP 获取多个 jsonObject 到我的应用程序。问题是我似乎无法为我的应用程序获取多个对象。下面是我想做的一个例子:

PHP 文件:

<?php 

   echo json_encode([$value1, $value2]);

?>

我使用如下所示的dataTask 方法将数据从 PHP 获取到我的 Swift 应用程序。

let task = URLSession.shared.dataTask(with: request) { (data: [Data?], 
response: URLResponse?, error: Error?) in

 var result = [Conversation]()
 var chck = [String]()  

 do{
     result = try JSONDecoder().decode([Conversation].self, from: data![0]) as Data)
     chck = try JSONDecoder().decode([String].self, from: data![1]) as Data)

  }catch{
       print("error"+error.localizedDescription)

}
        //do something
}
task.resume()

显然,我没有得到这两个变量。我试图将$value1$value2 放在一个数组中,然后将其回显到应用程序,但显然它对我不起作用。 data![0]data![1] 给出错误。谁能帮帮我?

【问题讨论】:

  • 将其作为数组发送,例如echo json_encode([$value1, $value2]);。您目前拥有的内容会创建一个无效的 JSON 字符串。
  • “我试图将 $value1 和 $value2 放在一个数组中......但是......它不起作用”......告诉我们你尝试了什么。这是正确的基本思想。如果value1value2 是相同的结构,则构建一个普通数组和json_encode。如果它们具有不同的结构,那么您可能想要构建一个关联数组(即字典)和json_encode
  • 实际上我试图按照 Jon 上面展示的那样做(但我没有放 [ ] )不知何故我认为问题来自 Swift 方面,我只是不知道如何解码对象。 . 我会告诉你我做了什么,我会编辑问题@Rob

标签: php json swift


【解决方案1】:

我从您的 Swift 代码中推断出 $value1$value2 是两种不同类型的结果。对于异构对象的集合,我建议使用关联数组(即字典):

<?php 

   echo json_encode(Array("result" => $value1, "chck" => $value2));

?>

你会用以下方式解析它:

struct ServerResult: Decodable {
    let result: [Conversation]
    let chck: [String]
}

let serverResult = try JSONDecoder().decode(ServerResult.self, from: data!)

现在,鉴于您尚未分享详细信息,我假设:

  • $value1 是一个结构合理的 Conversation 数组;
  • Conversation 本身就是 Decodable;和
  • $value2 是一个结构合理的 String 数组。

我还建议避免使用data!,因为如果出现某些服务器错误,您的应用就会崩溃。我建议你优雅地检测错误,例如:

let task = URLSession.shared.dataTask(with: request) { data, _, error in    
    guard let data = data, error == nil else {
        print(error ?? "Unknown error")
        return
    }

    do {
        let serverResult = try JSONDecoder().decode(ServerResult.self, from: data)
        // do something
    } catch let parseError {
        print(parseError)
    }
}
task.resume()

【讨论】:

  • 这正是我所拥有的,你的假设是 100% 正确的!...感谢您的帮助,不胜感激
猜你喜欢
  • 2015-07-07
  • 2014-07-08
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2021-04-27
相关资源
最近更新 更多